Drizzle Kit configuration is defined in drizzle.config.ts (or .js/.json) at the root of your project.
Quick Start
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
dialect: 'postgresql',
schema: './src/schema.ts',
out: './drizzle',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
Configuration API
defineConfig
Type-safe configuration helper function.
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
// Configuration options
});
Core Options
dialect
Database dialect for all commands.Type: 'postgresql' | 'mysql' | 'sqlite' | 'turso' | 'singlestore' | 'gel'export default defineConfig({
dialect: 'postgresql',
});
schema
Path(s) to your schema files. Supports glob patterns.// Single file
export default defineConfig({
schema: './src/schema.ts',
});
// Multiple files
export default defineConfig({
schema: ['./src/schema/*.ts', './src/models/*.ts'],
});
// Glob pattern
export default defineConfig({
schema: './src/db/**/*.schema.ts',
});
out
Output folder for migrations and introspection files.export default defineConfig({
out: './migrations',
});
driver
Explicit driver for specific database environments.Type: 'aws-data-api' | 'd1-http' | 'expo' | 'pglite' | 'durable-sqlite'Only required for specific drivers:
aws-data-api: AWS RDS Data API
d1-http: Cloudflare D1
expo: React Native Expo SQLite
pglite: PGlite (in-process Postgres)
durable-sqlite: Durable Objects SQLite
export default defineConfig({
dialect: 'postgresql',
driver: 'aws-data-api',
dbCredentials: {
database: 'mydb',
secretArn: process.env.SECRET_ARN!,
resourceArn: process.env.RESOURCE_ARN!,
},
});
Database Credentials
PostgreSQL
Connection String
Connection Parameters
AWS Data API
PGlite
export default defineConfig({
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
export default defineConfig({
dialect: 'postgresql',
dbCredentials: {
host: 'localhost',
port: 5432,
user: 'postgres',
password: 'password',
database: 'mydb',
ssl: false,
},
});
dbCredentials.ssl
boolean | string | object
SSL configurationType: boolean | 'require' | 'allow' | 'prefer' | 'verify-full' | ConnectionOptions// Boolean
ssl: true
// String mode
ssl: 'require'
// Full SSL options
ssl: {
rejectUnauthorized: true,
ca: fs.readFileSync('./ca.pem').toString(),
key: fs.readFileSync('./client-key.pem').toString(),
cert: fs.readFileSync('./client-cert.pem').toString(),
}
export default defineConfig({
dialect: 'postgresql',
driver: 'aws-data-api',
dbCredentials: {
database: 'mydb',
secretArn: process.env.SECRET_ARN!,
resourceArn: process.env.RESOURCE_ARN!,
},
});
dbCredentials.resourceArn
AWS RDS cluster ARN
export default defineConfig({
dialect: 'postgresql',
driver: 'pglite',
dbCredentials: {
url: './local.db',
},
});
MySQL / SingleStore
Connection String
Connection Parameters
export default defineConfig({
dialect: 'mysql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
export default defineConfig({
dialect: 'mysql',
dbCredentials: {
host: 'localhost',
port: 3306,
user: 'root',
password: 'password',
database: 'mydb',
},
});
SSL configurationssl: {
ca: fs.readFileSync('./ca.pem').toString(),
key: fs.readFileSync('./client-key.pem').toString(),
cert: fs.readFileSync('./client-cert.pem').toString(),
rejectUnauthorized: true,
}
SQLite
Local File
Cloudflare D1
Expo
export default defineConfig({
dialect: 'sqlite',
dbCredentials: {
url: './local.db',
},
});
export default defineConfig({
dialect: 'sqlite',
driver: 'd1-http',
dbCredentials: {
accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
databaseId: process.env.CLOUDFLARE_DATABASE_ID!,
token: process.env.CLOUDFLARE_API_TOKEN!,
},
});
export default defineConfig({
dialect: 'sqlite',
driver: 'expo',
// No credentials needed
});
Turso (LibSQL)
export default defineConfig({
dialect: 'turso',
dbCredentials: {
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN,
},
});
Turso authentication token
Migration Options
migrations
Configure migration storage and file naming.export default defineConfig({
migrations: {
table: 'migrations',
schema: 'drizzle',
prefix: 'timestamp',
},
});
migrations.table
string
default:"__drizzle_migrations"
Custom migrations table name.migrations: {
table: 'custom_migrations',
}
Custom schema for migrations table (PostgreSQL only).migrations: {
schema: 'public',
}
Migration file naming prefix.Type: 'index' | 'timestamp' | 'supabase' | 'unix' | 'none'migrations: {
prefix: 'timestamp',
}
Examples:
index: 0001_migration.sql, 0002_migration.sql
timestamp: 20240304120000_migration.sql
supabase: 20240304120000_migration.sql (Supabase format)
unix: 1709553600_migration.sql
none: migration.sql
breakpoints
Enable/disable SQL breakpoints in migrations.Required for databases that don’t support multiple DDL statements in one transaction (MySQL, SQLite, SingleStore).export default defineConfig({
breakpoints: true,
});
Filtering Options
tablesFilter
Filter tables using glob patterns.Useful for multi-project schemas or excluding specific tables.export default defineConfig({
// Single filter
tablesFilter: 'project1_*',
// Multiple filters
tablesFilter: ['users_*', 'posts_*'],
// Exclude tables
tablesFilter: ['!internal_*', '*'],
});
schemaFilter
schemaFilter
string | string[]
default:["public"]
PostgreSQL schema filters for introspect/push commands.export default defineConfig({
// Single schema
schemaFilter: 'public',
// Multiple schemas
schemaFilter: ['public', 'auth', 'api'],
});
extensionsFilters
Filter out extension-related internal tables.export default defineConfig({
extensionsFilters: ['postgis'],
});
This excludes PostGIS system tables:
geography_columns
geometry_columns
spatial_ref_sys
Introspection Options
introspect
Configure schema introspection behavior.export default defineConfig({
introspect: {
casing: 'preserve',
},
});
Column name casing in generated schema.Type: 'camel' | 'preserve'
camel: Converts user_name to userName
preserve: Keeps original database casing
introspect: {
casing: 'preserve',
}
Advanced Options
casing
Global column serialization casing.Type: 'camelCase' | 'snake_case'export default defineConfig({
casing: 'snake_case',
});
verbose
Print all SQL statements during push commands.export default defineConfig({
verbose: true,
});
strict
Always require confirmation for push commands.export default defineConfig({
strict: true,
});
entities
Configure entity introspection (PostgreSQL only).export default defineConfig({
entities: {
roles: true,
},
});
entities.roles
boolean | object
default:false
Introspect database roles.// Enable all roles
entities: {
roles: true,
}
// Provider-specific roles
entities: {
roles: {
provider: 'supabase',
},
}
// Include/exclude specific roles
entities: {
roles: {
include: ['authenticated', 'service_role'],
exclude: ['postgres'],
},
}
Providers: 'supabase' | 'neon' | custom string
Complete Examples
PostgreSQL Production
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
dialect: 'postgresql',
schema: './src/db/schema/**/*.ts',
out: './drizzle',
dbCredentials: {
host: process.env.DB_HOST!,
port: Number(process.env.DB_PORT),
user: process.env.DB_USER!,
password: process.env.DB_PASSWORD!,
database: process.env.DB_NAME!,
ssl: {
rejectUnauthorized: true,
ca: process.env.DB_CA_CERT,
},
},
migrations: {
table: 'migrations',
schema: 'public',
prefix: 'timestamp',
},
schemaFilter: ['public', 'auth'],
breakpoints: true,
verbose: false,
strict: true,
});
Multi-Project Setup
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
dialect: 'postgresql',
schema: './src/schema.ts',
out: './drizzle',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
// Only manage tables with project prefix
tablesFilter: ['app1_*'],
migrations: {
table: 'app1_migrations',
prefix: 'timestamp',
},
});
Turso Edge
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
dialect: 'turso',
schema: './src/schema.ts',
out: './drizzle',
dbCredentials: {
url: process.env.TURSO_DATABASE_URL!,
authToken: process.env.TURSO_AUTH_TOKEN,
},
introspect: {
casing: 'preserve',
},
});
Cloudflare D1
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
dialect: 'sqlite',
driver: 'd1-http',
schema: './src/schema.ts',
out: './migrations',
dbCredentials: {
accountId: process.env.CLOUDFLARE_ACCOUNT_ID!,
databaseId: process.env.CLOUDFLARE_DATABASE_ID!,
token: process.env.CLOUDFLARE_API_TOKEN!,
},
});
TypeScript Types
import type { Config } from 'drizzle-kit';
const config: Config = {
dialect: 'postgresql',
schema: './src/schema.ts',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
};
export default config;
Environment Variables
Load environment variables using dotenv:
import 'dotenv/config';
import { defineConfig } from 'drizzle-kit';
export default defineConfig({
dialect: 'postgresql',
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});
Or use a .env file:
DATABASE_URL=postgresql://user:pass@localhost:5432/db