import fs from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' import Database from 'better-sqlite3' import { drizzle } from 'drizzle-orm/better-sqlite3' import { migrate } from 'drizzle-orm/better-sqlite3/migrator' import * as schema from './schema' export type DB = ReturnType export function createDb(file: string) { fs.mkdirSync(path.dirname(file), { recursive: true }) const sqlite = new Database(file) sqlite.pragma('journal_mode = WAL') sqlite.pragma('synchronous = NORMAL') sqlite.pragma('foreign_keys = ON') sqlite.pragma('busy_timeout = 5000') return drizzle(sqlite, { schema }) } /** 迁移目录:开发时在 apps/server/drizzle,打包后与 dist 同级 */ function migrationsFolder() { const here = path.dirname(fileURLToPath(import.meta.url)) for (const candidate of [path.join(here, '../../drizzle'), path.join(here, '../drizzle')]) { if (fs.existsSync(path.join(candidate, 'meta/_journal.json'))) return candidate } throw new Error('找不到数据库迁移目录 drizzle/') } export function migrateDb(db: DB) { migrate(db, { migrationsFolder: migrationsFolder() }) } export { schema }