diff --git a/package.json b/package.json index a4159139..e9a61d70 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "db:generate": "drizzle-kit generate", "db:seed": "tsx scripts/seed.ts", "db:migrate": "drizzle-kit migrate", + "db:reset": "rm -f data.db data.db-shm data.db-wal && pnpm db:seed", "loc": "git ls-files | grep -vE '(lock|.db|_snapshot.json)' | xargs wc -l" }, "dependencies": { diff --git a/scripts/seed.ts b/scripts/seed.ts index 1e24183d..63877f88 100644 --- a/scripts/seed.ts +++ b/scripts/seed.ts @@ -43,27 +43,19 @@ function slugify(title: string): string { async function seed() { console.log("Seeding database..."); - // Drop and recreate tables for a clean seed - sqlite.exec(` - DROP TABLE IF EXISTS video_watch_events; - DROP TABLE IF EXISTS quiz_answers; - DROP TABLE IF EXISTS quiz_attempts; - DROP TABLE IF EXISTS quiz_options; - DROP TABLE IF EXISTS quiz_questions; - DROP TABLE IF EXISTS quizzes; - DROP TABLE IF EXISTS lesson_progress; - DROP TABLE IF EXISTS coupons; - DROP TABLE IF EXISTS team_members; - DROP TABLE IF EXISTS teams; - DROP TABLE IF EXISTS purchases; - DROP TABLE IF EXISTS enrollments; - DROP TABLE IF EXISTS lessons; - DROP TABLE IF EXISTS modules; - DROP TABLE IF EXISTS courses; - DROP TABLE IF EXISTS categories; - DROP TABLE IF EXISTS users; - DROP TABLE IF EXISTS __drizzle_migrations; - `); + // Drop every existing table for a clean seed, regardless of which + // schema version they came from (avoids stale tables blocking migrate()) + const existingTables = sqlite + .prepare( + `SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'` + ) + .all() as { name: string }[]; + + sqlite.pragma("foreign_keys = OFF"); + for (const { name } of existingTables) { + sqlite.exec(`DROP TABLE IF EXISTS "${name}";`); + } + sqlite.pragma("foreign_keys = ON"); // Create tables using the same Drizzle migrations as the live database migrate(db, { migrationsFolder });