drizzle-kit push
This guide assumes familiarity with:
drizzle-kit push
允许你直接将你的模式及后续的模式变化推送到数据库,
同时省略 SQL 文件的生成,
旨在覆盖 Drizzle 迁移的 代码优先 方法。
当你运行 Drizzle Kit 的 push
命令时,它会:
- 读取你的 Drizzle 模式文件并组成一个 JSON 快照
- 拉取(内省)数据库模式
- 根据这两者之间的差异生成 SQL 迁移
- 将 SQL 迁移应用到数据库
import * as p from "drizzle-orm/pg-core";
export const users = p.pgTable("users", {
id: p.serial().primaryKey(),
name: p.text(),
};
┌─────────────────────┐
│ ~ drizzle-kit push │
└─┬───────────────────┘
│ ┌──────────────────────────┐
└ Pull current datatabase schema ---------> │ │
│ │
┌ Generate alternations based on diff <---- │ DATABASE │
│ │ │
└ Apply migrations to the database -------> │ │
│ └──────────────────────────┘
│
┌────────────────────────────────────┴────────────────┐
create table users(id serial primary key, name text);
这是快速原型设计的最佳方法,
我们已经看到数十个团队和独立开发者成功地将其作为他们生产应用中的主要迁移流程。
它与蓝绿部署策略和无服务器数据库如
Planetscale、Neon、Turso 等非常契合。
drizzle-kit push
需要你指定 dialect
、模式文件的路径,
并提供数据库连接的 url
或 user:password@host:port/db
参数,
你可以通过 drizzle.config.ts 配置文件或 CLI 选项提供它们:
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
dbCredentials: {
url: "postgresql://user:password@host:port/dbname",
},
});
npx drizzle-kit push
npx drizzle-kit push --dialect=postgresql --schema=./src/schema.ts --url=postgresql://user:password@host:port/dbname
模式文件路径
你可以有一个单独的 schema.ts
文件,也可以根据需要在项目中分散多个模式文件。
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",
});
📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📂 user
│ │ ├ 📜 handler.ts
│ │ └ 📜 schema.ts
│ ├ 📂 posts
│ │ ├ 📜 handler.ts
│ │ └ 📜 schema.ts
│ └ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/**/schema.ts",
//or
schema: ["./src/user/schema.ts", "./src/posts/schema.ts"]
});
📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📂 schema
│ │ ├ 📜 user.ts
│ │ ├ 📜 post.ts
│ │ └ 📜 comment.ts
│ └ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/schema/*",
});
📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📜 userById.ts
│ ├ 📜 userByEmail.ts
│ ├ 📜 listUsers.ts
│ ├ 📜 user.sql.ts
│ ├ 📜 postById.ts
│ ├ 📜 listPosts.ts
│ └ 📜 post.sql.ts
│ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json
import { defineConfig } from "drizzle-kit";
export default defineConfig({
schema: "./src/**/*.sql.ts", // Dax's favourite
});
项目中多个配置文件
你可以在项目中有多个配置文件,当你有多个数据库阶段、多个数据库或同一项目中的不同数据库时,这非常有用:
npx drizzle-kit push --config=drizzle-dev.config.ts
npx drizzle-kit push --config=drizzle-prod.config.ts
yarn drizzle-kit push --config=drizzle-dev.config.ts
yarn drizzle-kit push --config=drizzle-prod.config.ts
pnpm drizzle-kit push --config=drizzle-dev.config.ts
pnpm drizzle-kit push --config=drizzle-prod.config.ts
bun drizzle-kit push --config=drizzle-dev.config.ts
bun drizzle-kit push --config=drizzle-prod.config.ts
📦 <项目根目录>
├ 📂 drizzle
├ 📂 src
├ 📜 .env
├ 📜 drizzle-dev.config.ts
├ 📜 drizzle-prod.config.ts
├ 📜 package.json
└ 📜 tsconfig.json
指定数据库驱动
IMPORTANT
Expo SQLite 和 OP SQLite 是设备上的(每用户)数据库,无法在其中 push
迁移。
对于嵌入式数据库,Drizzle 提供了 嵌入式迁移 - 查看我们的 快速开始 指南。
Drizzle Kit 不包含预打包的数据库驱动,
它将根据当前项目的 dialect
自动选择可用的数据库驱动 - 查看讨论。
大多数同一方言的驱动程序共享相同的连接参数,
至于像 aws-data-api
、pglight
和 d1-http
的例外情况,你将需要显式指定 driver
参数。
AWS Data API
PGLite
Cloudflare D1 HTTP
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
driver: "aws-data-api",
dbCredentials: {
database: "database",
resourceArn: "resourceArn",
secretArn: "secretArn",
},
};
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
driver: "pglite",
dbCredentials: {
// inmemory
url: ":memory:"
// or database folder
url: "./database/"
},
};
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "sqlite",
schema: "./src/schema.ts",
driver: "d1-http",
dbCredentials: {
accountId: "accountId",
databaseId: "databaseId",
token: "token",
},
};
包括表、模式和扩展
drizzle-kit push
默认管理 public
模式中的所有表。
你可以通过 tablesFilters
、schemaFilter
和 extensionFilters
选项配置表、模式和扩展的列表。
| |
---|
tablesFilter | 基于 glob 的表名过滤器,例如 ["users", "user_info"] 或 "user*" 。默认是 "*" |
schemaFilter | 模式名过滤器,例如 ["public", "drizzle"] 。默认是 ["public"] |
extensionsFilters | 已安装数据库扩展的列表,例如 ["postgis"] 。默认是 [] |
让我们配置 drizzle-kit 只操作 public 模式中的 所有表,
并让 drizzle-kit 知道有一个安装的 postgis 扩展,
它会在 public 模式中创建自己的表,因此 drizzle 可以忽略它们。
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
dbCredentials: {
url: "postgresql://user:password@host:port/dbname",
},
extensionsFilters: ["postgis"],
schemaFilter: ["public"],
tablesFilter: ["*"],
});
npx drizzle-kit push
扩展的配置选项列表
drizzle-kit push
有一些仅限于 CLI 的选项
| |
---|
verbose | 执行前打印所有 SQL 语句 |
strict | 执行 SQL 语句前始终要求确认 |
force | 自动接受所有数据丢失的语句 |
npx drizzle-kit push --strict --verbose --force
yarn drizzle-kit push --strict --verbose --force
pnpm drizzle-kit push --strict --verbose --force
bun drizzle-kit push --strict --verbose --force
我们推荐通过 drizzle.config.ts 文件配置 drizzle-kit
,
但如果有必要,你可以通过 CLI 提供所有配置选项,例如在 CI/CD 管道中等。
| | |
---|
dialect | required | 数据库方言,必须是 postgresql mysql sqlite turso singlestore |
schema | required | 指向 TypeScript 模式文件或包含多个模式文件的文件夹的路径 |
driver | | 驱动程序例外 aws-data-api d1-http pglight |
tablesFilter | | 表名过滤器 |
schemaFilter | | 模式名称过滤器。默认:["public"] |
extensionsFilters | | 数据库扩展内部数据库过滤器 |
url | | 数据库连接字符串 |
user | | 数据库用户 |
password | | 数据库密码 |
host | | 主机 |
port | | 端口 |
database | | 数据库名称 |
config | | 配置文件路径,默认=drizzle.config.ts |
npx drizzle-kit push dialect=postgresql schema=src/schema.ts url=postgresql://user:password@host:port/dbname
npx drizzle-kit push dialect=postgresql schema=src/schema.ts driver=pglite url=database/
npx drizzle-kit push dialect=postgresql schema=src/schema.ts --tablesFilter=‘user*’ --extensionsFilters=postgis url=postgresql://user:password@host:port/dbname
yarn drizzle-kit push dialect=postgresql schema=src/schema.ts url=postgresql://user:password@host:port/dbname
yarn drizzle-kit push dialect=postgresql schema=src/schema.ts driver=pglite url=database/
yarn drizzle-kit push dialect=postgresql schema=src/schema.ts --tablesFilter=‘user*’ --extensionsFilters=postgis url=postgresql://user:password@host:port/dbname
pnpm drizzle-kit push dialect=postgresql schema=src/schema.ts url=postgresql://user:password@host:port/dbname
pnpm drizzle-kit push dialect=postgresql schema=src/schema.ts driver=pglite url=database/
pnpm drizzle-kit push dialect=postgresql schema=src/schema.ts --tablesFilter=‘user*’ --extensionsFilters=postgis url=postgresql://user:password@host:port/dbname
bun drizzle-kit push dialect=postgresql schema=src/schema.ts url=postgresql://user:password@host:port/dbname
bun drizzle-kit push dialect=postgresql schema=src/schema.ts driver=pglite url=database/
bun drizzle-kit push dialect=postgresql schema=src/schema.ts --tablesFilter=‘user*’ --extensionsFilters=postgis url=postgresql://user:password@host:port/dbname
扩展示例
让我们在项目中声明 drizzle 模式并通过 drizzle-kit push
命令将其推送到数据库
📦 <项目根目录>
├ 📂 src
│ ├ 📜 schema.ts
│ └ 📜 index.ts
├ 📜 drizzle.config.ts
└ …
drizzle.config.ts
src/schema.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
dbCredentials: {
url: "postgresql://user:password@host:port/dbname"
},
});
import * as p from "drizzle-orm/pg-core";
export const users = p.pgTable("users", {
id: p.serial().primaryKey(),
name: p.text(),
})
现在让我们运行
npx drizzle-kit push
它将从数据库中拉取现有(空)模式,生成 SQL 迁移并在后台应用它
CREATE TABLE "users"(
id serial primary key,
name text,
)
完成 ✅