fix: 改用 prisma db push 同步生产数据库 schema

旧的 sqlite3 手动同步脚本会静默吞掉建表失败的错误,
导致 BlindBoxMember 等表在生产环境从未创建成功。
改用 prisma db push 做 schema 同步,由 Prisma 自身保证正确性。
This commit is contained in:
2026-03-01 22:12:25 +08:00
parent fe9a52e2e4
commit dfb7f464a0
2 changed files with 7 additions and 29 deletions
+3 -25
View File
@@ -1,36 +1,14 @@
#!/bin/sh
set -e
TEMPLATE="/app/template.db"
DB="/app/data/prod.db"
if [ ! -f "$DB" ]; then
echo "[db] First run — creating database from template"
cp "$TEMPLATE" "$DB"
exec node server.js
echo "[db] First run — initializing database"
fi
echo "[db] Syncing schema..."
# 1) Create any new tables
sqlite3 "$TEMPLATE" ".schema" | \
sed 's/CREATE TABLE /CREATE TABLE IF NOT EXISTS /g' | \
sed 's/CREATE INDEX /CREATE INDEX IF NOT EXISTS /g' | \
sed 's/CREATE UNIQUE INDEX /CREATE UNIQUE INDEX IF NOT EXISTS /g' | \
sqlite3 "$DB" 2>/dev/null || true
# 2) Add missing columns to existing tables
for table in $(sqlite3 "$TEMPLATE" "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '_prisma%'"); do
prod_cols=$(sqlite3 "$DB" "PRAGMA table_info('$table')" 2>/dev/null | cut -d'|' -f2 || echo "")
sqlite3 "$TEMPLATE" "PRAGMA table_info('$table')" | while IFS='|' read -r _cid name type notnull dflt _pk; do
if ! echo "$prod_cols" | grep -qx "$name"; then
alter="ALTER TABLE \"$table\" ADD COLUMN \"$name\" $type"
[ -n "$dflt" ] && alter="$alter DEFAULT $dflt"
sqlite3 "$DB" "$alter" 2>/dev/null && echo "[db] + $table.$name" || true
fi
done
done
node ./node_modules/prisma/build/index.js db push --skip-generate --accept-data-loss 2>&1
echo "[db] Schema sync complete"
exec node server.js