drizzle-kit push lets you literally push your schema and subsequent schema changes directly to the
database while omitting SQL files generation, itβs designed to cover code first
approach of Drizzle migrations.
How it works under the hood?
When you run Drizzle Kit push command it will:
Read through your Drizzle schema file(s) and compose a json snapshot of your schema
Pull(introspect) database schema
Based on differences between those two it will generate SQL migrations
Apply SQL migrations to the database
src/schema.ts
import * as p from "drizzle-orm/cockroach-core";export const users = p.cockroachTable("users", { id: p.int4().primaryKey(), name: p.string(),});
Itβs the best approach for rapid prototyping and weβve seen dozens of teams
and solo developers successfully using it as a primary migrations flow in their production applications.
It pairs exceptionally well with blue/green deployment strategy and serverless databases like
Planetscale, Neon, Turso and others.
drizzle-kit push requires you to specify dialect, path to the schema file(s) and either
database connection url or user:password@host:port/db params, you can provide them
either via drizzle.config.ts config file or via CLI options:
You can have a single schema.ts file or as many schema files as you want spread out across the project.
Drizzle Kit requires you to specify path(s) to them as a glob via schema configuration option.
You can have multiple config files in the project, itβs very useful when you have multiple database stages or multiple databases or different databases on the same project:
Drizzle Kit does not come with a pre-bundled database driver,
it will automatically pick an available database driver from your current project based on the dialect - see discussion.
Including tables and schemas
drizzle-kit push will manage all tables and schemas by default.
You can configure list of tables, schemas via tablesFilter and schemaFilter options.
tablesFilter
glob based table names filter, e.g. ["users", "user_info"] or "user*". Default is "*"
schemaFilter
Schema names filter, e.g. ["public", "drizzle"]. Default is β*β
Letβs configure drizzle-kit to only operate with all tables in public schema
and let drizzle-kit know that thereβs a postgis extension installed,
which creates itβs own tables in public schema, so drizzle can ignore them.
print the planned SQL changes, without applying them (dry run)
force
auto-accept all data-loss statements
npm
yarn
pnpm
bun
npx drizzle-kit push --explain --verbose --force
yarn drizzle-kit push --explain --verbose --force
pnpm drizzle-kit push --explain --verbose --force
bunx drizzle-kit push --explain --verbose --force
We recommend configuring drizzle-kit through drizzle.config.ts file,
yet you can provide all configuration options through CLI if necessary, e.g. in CI/CD pipelines, etc.
dialect
required
Database dialect, one of postgresqlmysqlsqlitetursosinglestoremssqlcockroach
schema
required
Path to typescript schema file(s) or folder(s) with multiple schema files