bc2b0e40c6
prisma db push 生成的 .schema 已自带 CREATE TABLE IF NOT EXISTS, 旧脚本的 sed 替换会生成 IF NOT EXISTS IF NOT EXISTS 导致 SQL 语法错误, 建表全部静默失败。现在只对 CREATE INDEX 做 IF NOT EXISTS 补充。
37 lines
1.2 KiB
Bash
37 lines
1.2 KiB
Bash
#!/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
|
|
fi
|
|
|
|
echo "[db] Syncing schema..."
|
|
|
|
# Schema already contains "CREATE TABLE IF NOT EXISTS" from Prisma.
|
|
# Only indexes need the IF NOT EXISTS addition.
|
|
sqlite3 "$TEMPLATE" ".schema" | \
|
|
sed 's/CREATE INDEX /CREATE INDEX IF NOT EXISTS /g' | \
|
|
sed 's/CREATE UNIQUE INDEX /CREATE UNIQUE INDEX IF NOT EXISTS /g' | \
|
|
sqlite3 "$DB"
|
|
|
|
# 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')" | cut -d'|' -f2)
|
|
|
|
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" && echo "[db] + $table.$name" || echo "[db] WARN: failed to add $table.$name"
|
|
fi
|
|
done
|
|
done
|
|
|
|
echo "[db] Schema sync complete"
|
|
exec node server.js
|