From 81eeb29f545d03dc876ff3a6c14028fcd6e8d988 Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Sat, 18 Apr 2026 13:27:54 +0800 Subject: [PATCH] feat(db): update SQLite configuration and seeding process - Changed DATABASE_URL in .env.example to use SQLite file. - Modified refresh function calls in AppShell.vue and public.vue to remove unnecessary parameter. - Enhanced run.sh to include seeding script execution. - Improved seed.js to ensure proper SQLite file path resolution and directory creation. - Introduced db-bun.ts for Bun compatibility with SQLite. - Updated db.ts to handle better-sqlite3 integration and path management. - Adjusted paths.ts to ensure reliable package root resolution for production. --- .env.example | 7 ++++--- app/components/AppShell.vue | 2 +- app/layouts/public.vue | 2 +- build-files/run.sh | 1 + build-files/seed.js | 22 ++++++++++++++++++---- packages/drizzle-pkg/database/sqlite/db-bun.ts | 21 +++++++++++++++++++++ packages/drizzle-pkg/database/sqlite/db.ts | 9 +++++++-- packages/drizzle-pkg/db.sqlite | Bin 114688 -> 94208 bytes packages/drizzle-pkg/lib/paths.ts | 4 ++-- packages/drizzle-pkg/seed.ts | 2 +- 10 files changed, 56 insertions(+), 14 deletions(-) create mode 100644 packages/drizzle-pkg/database/sqlite/db-bun.ts diff --git a/.env.example b/.env.example index ff96e1a..98f6fc8 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,6 @@ -DATABASE_URL=postgresql://postgres:xxxxxx@localhost:6666/postgres - -# Optional: first admin for an empty instance. `bun run db:seed` creates an admin only when no user has role=admin yet (same username/password rules as registration). +# DATABASE_URL=postgresql://postgres:xxxxxx@localhost:6666/postgres +DATABASE_URL=file:./db.sqlite +NITRO_PORT=3399 +# Optional: first admin for an empty instance. Creates an admin only when no user has role=admin yet (same username/password rules as registration). BOOTSTRAP_ADMIN_USERNAME= BOOTSTRAP_ADMIN_PASSWORD= \ No newline at end of file diff --git a/app/components/AppShell.vue b/app/components/AppShell.vue index d9c93de..155c33b 100644 --- a/app/components/AppShell.vue +++ b/app/components/AppShell.vue @@ -17,7 +17,7 @@ const { allowRegister, siteName } = useGlobalConfig() const logoutLoading = ref(false) onMounted(() => { - refresh(true).catch(() => {}) + refresh().catch(() => {}) }) const displayName = computed(() => { diff --git a/app/layouts/public.vue b/app/layouts/public.vue index 13be99e..70db257 100644 --- a/app/layouts/public.vue +++ b/app/layouts/public.vue @@ -65,7 +65,7 @@ function syncModeFromStorage() { } onMounted(() => { - refresh(true).catch(() => {}) + refresh().catch(() => {}) syncModeFromStorage() }) diff --git a/build-files/run.sh b/build-files/run.sh index ba1bc71..694caf6 100644 --- a/build-files/run.sh +++ b/build-files/run.sh @@ -5,4 +5,5 @@ if [ -f .env ]; then fi node server/migrate-sqlite.js migrations +node server/seed.js node server/index.mjs \ No newline at end of file diff --git a/build-files/seed.js b/build-files/seed.js index 79cccc0..e1a0bf1 100644 --- a/build-files/seed.js +++ b/build-files/seed.js @@ -8,6 +8,7 @@ */ import Database from 'better-sqlite3' import { hash } from 'bcryptjs' +import { mkdirSync } from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' @@ -23,12 +24,25 @@ function derivePublicSlug(username) { return PUBLIC_SLUG_REGEX.test(lower) ? lower : null } -function openSqlite() { - const dbUrl = process.env.DATABASE_URL || '' - const sqlitePath = dbUrl.startsWith('file:') ? dbUrl.slice(5) : dbUrl - if (!sqlitePath) { +/** + * 与 `migrate-sqlite.js` 一致:相对路径相对 `process.cwd()`(例如 `.output/run.sh` 下与迁移写入同一文件)。 + * Nitro 内 `resolveSqliteDatabaseUrl` 在无法锚定 drizzle-pkg 时也会回退到 cwd,避免「迁移/seed 成功、服务 CANTOPEN」。 + */ +function resolveSqliteFilePath(dbUrl) { + const stripped = dbUrl.startsWith('file:') ? dbUrl.slice('file:'.length) : dbUrl + if (!stripped) { throw new Error('DATABASE_URL 未设置,且未提供有效的 SQLite 文件路径') } + if (path.isAbsolute(stripped)) { + return stripped + } + return path.resolve(process.cwd(), stripped) +} + +function openSqlite() { + const dbUrl = process.env.DATABASE_URL || '' + const sqlitePath = resolveSqliteFilePath(dbUrl) + mkdirSync(path.dirname(sqlitePath), { recursive: true }) return new Database(sqlitePath) } diff --git a/packages/drizzle-pkg/database/sqlite/db-bun.ts b/packages/drizzle-pkg/database/sqlite/db-bun.ts new file mode 100644 index 0000000..59579ea --- /dev/null +++ b/packages/drizzle-pkg/database/sqlite/db-bun.ts @@ -0,0 +1,21 @@ +import { drizzle } from "drizzle-orm/bun-sqlite"; +import { resolveSqliteDatabaseUrl } from "../../lib/resolve-sqlite-url"; + +/** + * Bun 无法加载 better-sqlite3 原生模块;`bun run seed.ts` 等脚本使用本模块。 + * Nitro/Node 服务端仍用 `db.ts`(better-sqlite3)。 + */ +const rawUrl = process.env.DATABASE_URL; +if (!rawUrl) { + throw new Error("DATABASE_URL 未设置"); +} +const resolvedUrl = resolveSqliteDatabaseUrl(rawUrl); +process.env.DATABASE_URL = resolvedUrl; + +const sqlitePath = resolvedUrl.startsWith("file:") + ? resolvedUrl.slice("file:".length) + : resolvedUrl; + +const _db = drizzle(sqlitePath); + +export { _db as dbGlobal }; diff --git a/packages/drizzle-pkg/database/sqlite/db.ts b/packages/drizzle-pkg/database/sqlite/db.ts index 180e2e6..89b9cf9 100644 --- a/packages/drizzle-pkg/database/sqlite/db.ts +++ b/packages/drizzle-pkg/database/sqlite/db.ts @@ -1,4 +1,4 @@ -import { drizzle } from "drizzle-orm/libsql"; +import { drizzle } from "drizzle-orm/better-sqlite3"; import { resolveSqliteDatabaseUrl } from "../../lib/resolve-sqlite-url"; if (process.env.NODE_ENV === "production") { @@ -13,6 +13,11 @@ if (!rawUrl) { const resolvedUrl = resolveSqliteDatabaseUrl(rawUrl); process.env.DATABASE_URL = resolvedUrl; -const _db = drizzle(resolvedUrl); +// better-sqlite3 需要裸文件路径;`file:` 前缀仍保留在 DATABASE_URL 供 drizzle-kit 等使用 +const sqlitePath = resolvedUrl.startsWith("file:") + ? resolvedUrl.slice("file:".length) + : resolvedUrl; + +const _db = drizzle(sqlitePath); export { _db as dbGlobal }; \ No newline at end of file diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite index d47bf7e013a166cf473b4728898d5bb781b0fb22..e3b7ba546f5d59f7c22bb37f1d478ca89e243789 100644 GIT binary patch delta 479 zcmZo@U~hQ9IzgJ1g@J)Ve4>IqkfAsA#Kx2qdkY3rM%GYHR#t=LG*bgZi!@yeW201E z6C(>#-9$snBwfq26thJ0#1xa%v_!_ahrX-GGtQm&YJvPFhdcZ##AwyO6^JE=!D}7CZlCpy`4HCUVTuSo7Q%y^<{e5#BE7CKw zLo>ZA-Mxcd!t(;1i@Z`Q!%Zq&lO2I#W@pGax?Ql_A&^7#V0EW2(WRX@d?S3svg}ubUvDS%M=(D*a)cM0_j2W9}kcV G_a6YJA9v~i literal 114688 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

4-HEXx-&9N2jM8Y3`_~$0o;wUv} z8_F8WW>oAaIoFdNNnG-(}+_wgJ#U`7$f4 z{Kq3l7lGvi0nxo(b)(R)&`)HGb4xQ;q3L2WIiR8ZO?tJl6N~2{FKp%{+nKuuKdS4& z5;jPRu77`2*NeB|x;DHbGtTlz;EveTj{GA>Plg8vWpce4IdL5%77w9?K!wBBF3<`m z*SVaNuuR^2mM)Ovwo$q%Cc3bL%SvU_ngo>%D=%`ouRs&ky{DdkIjo#o{>t7^W3Kn#hg3=u8EahdHEKuO*pSwcHhT)87e~y7 zLTF5xLc}x8^pa9+yoR7qzz|^`bI)$$!1nO zhX(4T>ts(~Q~{H7LhsWJH!u_sLj>pu+XCdBt1zZYXK?zK+>MIO0mSG5<5;XBWXQcm z4or|OvxhH>?Komb4n|<*kM7Q)2Yci3$$;F_jN^nL;K;#4*b77`ftY6=*2;q>{^yE> IBS1I)KWQftb^rhX diff --git a/packages/drizzle-pkg/lib/paths.ts b/packages/drizzle-pkg/lib/paths.ts index 860b6e6..a91277a 100644 --- a/packages/drizzle-pkg/lib/paths.ts +++ b/packages/drizzle-pkg/lib/paths.ts @@ -18,7 +18,7 @@ function isDrizzlePkgRoot(dir: string): boolean { /** * `drizzle-pkg` 包根目录(与 `package.json`、`db.sqlite` 同级)。 * - 开发:用 `import.meta` 锚定,避免 cwd 变化把 `file:db.sqlite` 指到错误文件(只读 / DBMOVED)。 - * - 生产:打包后 chunk 路径不可靠,回退到 `cwd/packages/drizzle-pkg`;部署时建议使用绝对 `DATABASE_URL`。 + * - 生产:打包后 chunk 路径不可靠,回退到 `cwd/packages/drizzle-pkg`;再不行则回退 `process.cwd()`(与 `.output` 下 migrate/seed 的相对 `DATABASE_URL` 一致)。 */ export function getDrizzlePkgRoot(): string { const fromMeta = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); @@ -29,5 +29,5 @@ export function getDrizzlePkgRoot(): string { if (isDrizzlePkgRoot(fromCwd)) { return fromCwd; } - return fromMeta; + return process.cwd(); } diff --git a/packages/drizzle-pkg/seed.ts b/packages/drizzle-pkg/seed.ts index 169241b..c8f393f 100644 --- a/packages/drizzle-pkg/seed.ts +++ b/packages/drizzle-pkg/seed.ts @@ -1,7 +1,7 @@ import "./env"; import { hash } from "bcryptjs"; import { eq, sql } from "drizzle-orm"; -import { dbGlobal } from "./lib/db"; +import { dbGlobal } from "./database/sqlite/db-bun"; import { users } from "./lib/schema/auth"; /** Match `server/service/auth/index.ts` */