feat: bootstrap D1 schema when database is empty

This commit is contained in:
qaz741wsd856 2025-12-29 13:17:01 +00:00
parent 99a511f9f0
commit 62a36acbb6
2 changed files with 421 additions and 353 deletions

View file

@ -108,6 +108,40 @@ jobs:
echo "⏭️ R2_NAME_DEV not set, skipping R2 binding" echo "⏭️ R2_NAME_DEV not set, skipping R2 binding"
fi fi
- name: Bootstrap D1 schema when database is empty (dev)
run: |
set -euo pipefail
WRANGLER="npx --yes wrangler@${WRANGLER_VERSION}"
TABLE_COUNT=$($WRANGLER d1 execute vault1 --env dev --remote --command \
"SELECT COUNT(*) AS cnt FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT IN ('_cf_METADATA','d1_migrations');" \
--json | jq -r '.[0].results[0].cnt // 0')
echo "Existing user table count: ${TABLE_COUNT}"
if [ "${TABLE_COUNT}" = "0" ]; then
echo "🆕 Empty D1 database detected; applying sql/schema.sql..."
$WRANGLER d1 execute vault1 --env dev --remote --file sql/schema.sql
echo "📝 Marking existing migrations as applied (schema.sql already includes them)"
BOOTSTRAP_SQL="$(mktemp)"
cat >"${BOOTSTRAP_SQL}" <<'SQL'
CREATE TABLE IF NOT EXISTS d1_migrations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL,
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);
SQL
shopt -s nullglob
for f in migrations/*.sql; do
echo "INSERT OR IGNORE INTO d1_migrations (name) VALUES ('$(basename "${f}")');" >>"${BOOTSTRAP_SQL}"
done
$WRANGLER d1 execute vault1 --env dev --remote --file "${BOOTSTRAP_SQL}"
rm -f "${BOOTSTRAP_SQL}"
else
echo "⏭️ D1 already has tables; skipping base schema bootstrap"
fi
- name: Apply D1 database migrations (dev) - name: Apply D1 database migrations (dev)
run: | run: |
set -euo pipefail # Ensure pipe returns first non-zero exit code set -euo pipefail # Ensure pipe returns first non-zero exit code

View file

@ -118,6 +118,40 @@ jobs:
echo "⏭️ R2_NAME not set, skipping R2 binding" echo "⏭️ R2_NAME not set, skipping R2 binding"
fi fi
- name: Bootstrap D1 schema when database is empty
run: |
set -euo pipefail
WRANGLER="npx --yes wrangler@${WRANGLER_VERSION}"
TABLE_COUNT=$($WRANGLER d1 execute vault1 --remote --command \
"SELECT COUNT(*) AS cnt FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT IN ('_cf_METADATA','d1_migrations');" \
--json | jq -r '.[0].results[0].cnt // 0')
echo "Existing user table count: ${TABLE_COUNT}"
if [ "${TABLE_COUNT}" = "0" ]; then
echo "🆕 Empty D1 database detected; applying sql/schema.sql..."
$WRANGLER d1 execute vault1 --remote --file sql/schema.sql
echo "📝 Marking existing migrations as applied (schema.sql already includes them)"
BOOTSTRAP_SQL="$(mktemp)"
cat >"${BOOTSTRAP_SQL}" <<'SQL'
CREATE TABLE IF NOT EXISTS d1_migrations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE NOT NULL,
applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);
SQL
shopt -s nullglob
for f in migrations/*.sql; do
echo "INSERT OR IGNORE INTO d1_migrations (name) VALUES ('$(basename "${f}")');" >>"${BOOTSTRAP_SQL}"
done
$WRANGLER d1 execute vault1 --remote --file "${BOOTSTRAP_SQL}"
rm -f "${BOOTSTRAP_SQL}"
else
echo "⏭️ D1 already has tables; skipping base schema bootstrap"
fi
- name: Apply D1 database migrations - name: Apply D1 database migrations
run: | run: |
set -euo pipefail # Ensure pipe returns first non-zero exit code set -euo pipefail # Ensure pipe returns first non-zero exit code