Migrations
Database migration workflow with Drizzle Kit — generate, run, roll back, and manage schema changes.
Migrations
OmniSvelte uses Drizzle Kit for migrations. The generated src/lib/db/server/schema.ts is the source of truth — Drizzle Kit diffs it against your database to produce migration SQL.
Setup
OmniSvelte writes a drizzle.config.ts on first run:
// drizzle.config.ts (auto-generated — safe to edit)
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
schema: './src/lib/db/server/schema.ts',
out: './drizzle/migrations',
dialect: 'postgresql',
dbCredentials: { url: process.env.DATABASE_URL! }
});Add convenience scripts to package.json:
{
"scripts": {
"db:push": "drizzle-kit push",
"db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate",
"db:studio": "drizzle-kit studio",
"db:drop": "drizzle-kit drop"
}
}Development workflow
During development, use db:push — it applies schema changes directly without creating migration files:
pnpm db:pushSafe for local dev. Never use
db:pushin production.
Production workflow
- Generate a migration file from your schema changes:
pnpm db:generate --name add_published_to_postsThis creates drizzle/migrations/0001_add_published_to_posts.sql.
Commit the migration file.
Run pending migrations in CI/CD or on deploy:
pnpm db:migrateDrizzle Studio
Visual database browser — runs in your browser:
pnpm db:studio
# Open https://local.drizzle.studioMigration file structure
drizzle/
migrations/
0000_initial_schema.sql
0001_add_published_to_posts.sql
0002_add_tags_table.sql
meta/
_journal.json ← migration history
0000_snapshot.json ← schema snapshots for diffing
Rolling back
Drizzle Kit doesn't auto-generate rollbacks. Write a down migration manually or use db:drop to remove a specific migration from the journal:
pnpm db:drop
# Interactive: select which migration to remove from the journalSeeding
OmniSvelte doesn't ship a seeder runner yet (planned for v0.2). Use a plain script for now:
// scripts/seed.ts
import { db } from '../src/lib/db/server/index.js';
import { users } from '../src/lib/db/server/schema.js';
await db.insert(users).values([
{ name: 'Admin', email: 'admin@example.com', role: 'admin' }
]);
console.log('Seeded!');
process.exit(0);Run with:
npx tsx scripts/seed.ts