drizzle-kit push

本指南假定您已熟悉:

drizzle-kit push 允许你直接将 schema 以及后续的 schema 变更真正推送到 数据库,同时省略 SQL 文件的生成;它旨在覆盖 Drizzle migrations 的 代码优先 方法。

它是如何在底层工作的?

当你运行 Drizzle Kit 的 push 命令时,它会:

  1. 读取你的 Drizzle schema 文件,并构建 schema 的 JSON 快照
  2. 拉取(introspect)数据库 schema
  3. 根据两者之间的差异生成 SQL migrations
  4. 将 SQL migrations 应用到数据库
src/schema.ts
import * as p from "drizzle-orm/cockroach-core";

export const users = p.cockroachTable("users", {
  id: p.int4().primaryKey(),
  name: p.string(),
});
┌─────────────────────┐                  
│ ~ drizzle-kit push  │                  
└─┬───────────────────┘                  
  │                                           ┌──────────────────────────┐
  └ 拉取当前数据库 schema --------------------> │                          │
                                              │                          │
  ┌ 基于差异生成变更 <------------------------ │         DATABASE         │
  │                                           │                          │
  └ 将 migrations 应用到数据库 ---------------> │                          │
                                       │      └──────────────────────────┘

  ┌───────────────────────────────────────────┴────────────────┐
   CREATE TABLE "users" ("id" int4 PRIMARY KEY, "name" string);

它是快速原型开发的最佳方式,我们已经看到许多团队和个人开发者成功地将其作为生产应用中的主要 migrations 流程。 它与蓝绿部署策略以及无服务器数据库(如 PlanetscaleNeonTurso 等)配合得非常好。




drizzle-kit push 要求你指定 dialectschema 文件路径,以及数据库连接的 urluser:password@host:port/db 参数,你可以通过 drizzle.config.ts 配置文件或通过 CLI 选项来提供它们:

使用配置文件
使用 CLI 选项
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "cockroach",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname",
  },
});
npx drizzle-kit push

Schema 文件路径

你可以只有一个 schema.ts 文件,也可以在项目中分散放置任意多个 schema 文件。 Drizzle Kit 要求你通过 schema 配置选项,以 glob 的形式指定它们的路径。

Example 1
Example 2
Example 3
Example 4
📦 <project root>
 ├ ...
 ├ 📂 drizzle
 ├ 📂 src
 │ ├ ...
 │ ├ 📜 index.ts
 │ └ 📜 schema.ts 
 ├ 📜 drizzle.config.ts
 └ 📜 package.json
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  schema: "./src/schema.ts",
});

一个项目中的多个配置文件

你可以在项目中有多个配置文件,这在你有多个数据库阶段、多个数据库,或者同一项目中存在不同数据库时非常有用:

npm
yarn
pnpm
bun
npx drizzle-kit push --config=drizzle-dev.config.ts
npx drizzle-kit push --config=drizzle-prod.config.ts
📦 <project root>
 ├ 📂 drizzle
 ├ 📂 src
 ├ 📜 .env
 ├ 📜 drizzle-dev.config.ts
 ├ 📜 drizzle-prod.config.ts
 ├ 📜 package.json
 └ 📜 tsconfig.json

指定数据库驱动

Drizzle Kit 不会自带预打包的数据库驱动, 它会根据 dialect 自动从你当前项目中选择可用的数据库驱动 - 查看讨论.

包含表和 schema

drizzle-kit push 默认会管理所有表和 schema。 你可以通过 tablesFilterschemaFilter 选项配置表和 schema 的列表。

tablesFilter基于 glob 的表名过滤器,例如 ["users", "user_info"]"user*"。默认值是 "*"
schemaFilterschema 名称过滤器,例如 ["public", "drizzle"]。默认值是 "*"

让我们配置 drizzle-kit 仅操作 public schema 中的所有表, 并让 drizzle-kit 知道安装了一个 postgis 扩展, 它会在 public schema 中创建自己的表,因此 drizzle 可以忽略它们。

drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "cockroach",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname",
  },
  schemaFilter: ["public"],
  tablesFilter: ["*"],
});
npx drizzle-kit push

扩展配置列表

drizzle-kit push 还有一组仅限 CLI 的选项

verbose在执行前打印所有 SQL 语句
explain打印计划中的 SQL 变更,但不实际应用它们(dry run)
force自动接受所有会导致数据丢失的语句

npm
yarn
pnpm
bun
npx drizzle-kit push --explain --verbose --force



我们建议通过 drizzle.config.ts 文件来配置 drizzle-kit, 但如果有需要,你也可以通过 CLI 提供所有配置选项,例如在 CI/CD 流水线中等。

dialectrequired数据库方言,取值之一为 postgresql mysql sqlite turso singlestore mssql cockroach
schemarequiredtypescript schema 文件或包含多个 schema 文件的文件夹路径
tablesFilter表名过滤器
schemaFilterschema 名称过滤器。默认值:["*"]
url数据库连接字符串
user数据库用户
password数据库密码
host主机
port端口
database数据库名称
config配置文件路径,默认=drizzle.config.ts
npm
yarn
pnpm
bun
npx drizzle-kit push dialect=cockroach schema=src/schema.ts url=postgresql://user:password@host:port/dbname
npx drizzle-kit push dialect=cockroach schema=src/schema.ts driver=pglite url=database/
npx drizzle-kit push dialect=cockroach schema=src/schema.ts --tablesFilter=‘user*’ url=postgresql://user:password@host:port/dbname

扩展示例

让我们在项目中声明 drizzle schema,并通过 drizzle-kit push 命令将其推送到数据库

📦 <project root>
 ├ 📂 src
 │ ├ 📜 schema.ts
 │ └ 📜 index.ts
 ├ 📜 drizzle.config.ts
 └ …
drizzle.config.ts
src/schema.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "cockroach",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname"
  },
});

现在让我们运行

npx drizzle-kit push

它会从数据库中拉取现有的(空)schema,并在底层生成 SQL migration 然后应用它

CREATE TABLE "users" (
	"id" int4 PRIMARY KEY,
	"name" string
);

完成 ✅