drizzle-kit pull

本指南假定您已熟悉:

drizzle-kit pull 可以直接拉取(introspect)你现有的数据库 schema,并生成 schema.ts 的 drizzle schema 文件, 它旨在覆盖 Drizzle migrations 的 database first 方法。

底层是如何工作的?

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

  1. 拉取你现有数据库的 schema(DDL)
  2. 生成 schema.ts 的 drizzle schema 文件并保存到 out 文件夹
                                  ┌────────────────────────┐      ┌───────────────────────────────────────┐ 
                                  │                        │ <---  CREATE TABLE `users` (
┌──────────────────────────┐      │                        │        `id` integer primary key autoincrement,
│ ~ drizzle-kit pull       │      │                        │        `name` TEXT,
└─┬────────────────────────┘      │        DATABASE        │        `email` TEXT UNIQUE
  │                               │                        │       );
  └ 拉取数据库 schema -------> │                        │
  ┌ 生成 Drizzle           <----- │                        │
  │ schema TypeScript 文件      └────────────────────────┘

  v
import * as p from "drizzle-orm/sqlite-core";

export const users = p.sqliteTable("users", {
	id: p.integer().primaryKey({ autoIncrement: true }),
	name: p.text(),
	email: p.text().unique(),
});

如果你需要在 TypeScript 项目之外管理数据库 schema,或者 你使用的是由他人管理的数据库,这会是一个很好的方法。




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

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

export default defineConfig({
  dialect: "sqlite",
  dbCredentials: {
    url: "./sqlite.db",
  },
});
npx drizzle-kit pull

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

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

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

指定数据库驱动

IMPORTANT

Expo SQLiteOP SQLite 是设备端(按用户)数据库,无法从中 pull 数据库 schema。
对于嵌入式数据库,Drizzle 提供了 embedded migrations——请查看我们的 快速开始 指南。

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

对于 Cloudflare D1 HTTP,请显式指定 driver: "d1-http"

import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "sqlite",
  driver: "d1-http",
  dbCredentials: {
    accountId: "accountId",
    databaseId: "databaseId",
    token: "token",
  },
});

初始 pull

你可以使用 --init 标志将拉取到的 schema 标记为数据库中的一个已应用迁移, 这样后续所有迁移都会与最初的迁移进行 diff

npx drizzle-kit push --init

包含表

drizzle-kit pull 默认会 introspect 所有 SQLite 表。 你可以通过 tablesFilter 配置表列表。

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

让我们配置 drizzle-kit 来 introspect SQLite 数据库中的所有表

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

export default defineConfig({
  dialect: "sqlite",
  dbCredentials: {
     url: "./sqlite.db",
  },
  tablesFilter: ["*"],
});
npx drizzle-kit pull

配置项扩展列表

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

dialectrequired数据库方言,取 postgresql mysql sqlite turso singlestore mssql cockroach 之一
driver驱动例外,例如 d1-http
outmigrations 输出文件夹路径,默认是 ./drizzle
url数据库连接字符串
user数据库用户
password数据库密码
host主机
port端口
database数据库名
config配置文件路径,默认是 drizzle.config.ts
introspect-casing为列、表等创建 JS 键的策略。preserve camel
tablesFilter表名过滤器
npm
yarn
pnpm
bun
npx drizzle-kit pull --dialect=sqlite --url=./sqlite.db
npx drizzle-kit pull --dialect=sqlite --tablesFilter=‘user*’ url=./sqlite.db