Skip to content

データベース

Memory

テストやローカル開発向けです。プロセス終了時に消えます。

ts
const database = createSonolusDatabase({
    driver: 'memory',
    seed: { level: [tutorialLevel] },
})

JSON

単一プロセスの小規模なデータやfixture向けです。書き込みは一時ファイルからrenameするため、ファイル単位では原子的です。

ts
const database = createSonolusDatabase({
    driver: 'json',
    path: './data/sonolus.json',
    mode: 'readwrite',
})

PostgreSQL

Honolusは特定のpgバージョンを強制せず、pg.Pool互換オブジェクトを受け取ります。

ts
import { Pool } from 'pg'
import {
    PostgresExecutor,
    createSonolusDatabase,
} from '@untitledsekai/honolus'

const pool = new Pool({
    connectionString: process.env.DATABASE_URL,
    max: 20,
    connectionTimeoutMillis: 5_000,
    idleTimeoutMillis: 30_000,
})

const executor = new PostgresExecutor({
    pool,
    statementTimeoutMs: 5_000,
    lockTimeoutMs: 1_000,
    metrics,
})

export const database = createSonolusDatabase({
    driver: 'sql',
    executor,
    autoMigrate: false,
    cursorSecret: process.env.CURSOR_SECRET,
})

本番ではdeploy前の独立したmigration jobからdatabase.migrate()相当の処理を実行し、web processのautoMigrateは無効にします。

Repository

ts
const levels = database.repository('level')

await levels.put(level)
const found = await levels.get(level.name)
await levels.delete(level.name)

put{ type, name }をキーにしたupsertです。複数itemをまとめて変更する場合はtransactionを使用します。

ts
await database.transaction?.(async (tx) => {
    await tx.repository('level').put(levelA)
    await tx.repository('level').put(levelB)
})

Released under the ISC License.