Overview
Autonome uses Drizzle Kit to manage database migrations. The workflow is:- Edit schema: Modify
src/db/schema.ts - Generate migration: Run
bun run db:generate - Review SQL: Check generated migration in
drizzle/directory - Apply migration: Run
bun run db:migrate
Configuration
Drizzle Kit configuration is indrizzle.config.ts:
dialect: PostgreSQL databaseout: Migrations stored indrizzle/directoryschema: Single source of truth atsrc/db/schema.tsdbCredentials.url: Read fromDATABASE_URLenvironment variable
Available Commands
All database commands are defined inpackage.json:
db:generate
Generate migration files from schema changes:- Compares
src/db/schema.tsto current database state - Generates SQL migration file in
drizzle/directory - Creates a metadata file (
.json) for tracking
- After modifying tables, columns, or indexes in
src/db/schema.ts - Before committing schema changes to Git
db:migrate
Apply pending migrations to the database:- Reads all migration files in
drizzle/ - Checks which migrations have been applied (via
__drizzle_migrationstable) - Applies pending migrations in order
- After generating a new migration
- On production deployment to sync database
- When setting up a new development environment
db:push
Push schema changes directly to database (skip migration generation):- Compares
src/db/schema.tsto database - Applies changes directly without generating migration files
- Rapid prototyping in local development
- Throwaway feature branches
- Never on production
db:seed
Reset database and seed with default models:- Drops all tables
- Recreates schema
- Seeds with default AI models and variants
db:studio
Launch Drizzle Studio (database GUI):- Starts local web server
- Opens browser at
https://local.drizzle.studio - Provides GUI for browsing/editing database data
- Debugging database state
- Manual data inspection
- Quick one-off updates
Migration Workflow
Step 1: Modify Schema
Editsrc/db/schema.ts with your changes:
Step 2: Generate Migration
drizzle/:
- Correct column types
- Proper table names (quoted if capitalized)
- Safe default values (avoid breaking existing data)
Step 3: Apply Migration
Step 4: Commit Changes
src/db/schema.ts(TypeScript schema)drizzle/XXXX_*.sql(generated SQL migration)
Common Migration Scenarios
Adding a Column
Adding a Required Column with Default
Renaming a Column
Drizzle cannot detect renames automatically. You must:-
Generate SQL for new column:
-
Manually edit migration:
-
Apply migration:
Dropping a Column
- Backing up data first
- Using a two-step migration (make nullable → drop later)
Adding an Index
Creating a New Table
Migration Best Practices
1. Always Review Generated SQL
Don’t blindly apply migrations:- Destructive operations (DROP, ALTER)
- Missing defaults for NOT NULL columns
- Incorrect data types
2. Test Migrations Locally First
3. Use Transactions for Complex Migrations
For multi-step migrations, wrap in a transaction:4. Never Edit Applied Migrations
Once a migration is applied:- Don’t edit the SQL file
- Don’t rename the file
- Create a new migration to fix issues
5. Handle Breaking Changes Carefully
For destructive changes:- Add new column (nullable)
- Migrate data from old → new
- Make required (add NOT NULL constraint)
- Drop old column (in separate migration)
Troubleshooting
”Migration already applied”
Migration file exists but hasn’t been applied:“Column already exists”
Schema out of sync with database:“SSL connection required”
PostgreSQL SSL configuration issue:“Cannot read properties of undefined”
MissingDATABASE_URL environment variable:
Production Deployment
For production deployments:- Commit migrations to Git
- Deploy code with new schema file
- Run migrations on production database:
- Restart application to use new schema
- Keep previous deployment available
- Test rollback migrations in staging first
- Consider blue-green deployments for zero downtime
Next Steps
- Database Schema - Review complete schema documentation
- Repositories - Learn data access patterns

