index.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. import fs from 'node:fs'
  2. import path from 'node:path'
  3. import { fileURLToPath } from 'node:url'
  4. import Database from 'better-sqlite3'
  5. import { drizzle } from 'drizzle-orm/better-sqlite3'
  6. import { migrate } from 'drizzle-orm/better-sqlite3/migrator'
  7. import * as schema from './schema'
  8. export type DB = ReturnType<typeof createDb>
  9. export function createDb(file: string) {
  10. fs.mkdirSync(path.dirname(file), { recursive: true })
  11. const sqlite = new Database(file)
  12. sqlite.pragma('journal_mode = WAL')
  13. sqlite.pragma('synchronous = NORMAL')
  14. sqlite.pragma('foreign_keys = ON')
  15. sqlite.pragma('busy_timeout = 5000')
  16. return drizzle(sqlite, { schema })
  17. }
  18. /** 迁移目录:开发时在 apps/server/drizzle,打包后与 dist 同级 */
  19. function migrationsFolder() {
  20. const here = path.dirname(fileURLToPath(import.meta.url))
  21. for (const candidate of [path.join(here, '../../drizzle'), path.join(here, '../drizzle')]) {
  22. if (fs.existsSync(path.join(candidate, 'meta/_journal.json'))) return candidate
  23. }
  24. throw new Error('找不到数据库迁移目录 drizzle/')
  25. }
  26. export function migrateDb(db: DB) {
  27. migrate(db, { migrationsFolder: migrationsFolder() })
  28. }
  29. export { schema }