You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

drizzle.config.ts的作用是什么?为何需重复指定schema?

关于Drizzle ORM与drizzle-kit重复配置Schema的疑问

问题背景

我正在用Drizzle + Next.js + Vercel搭建无服务器后端,为了使用Drizzle的ORM API,我这样初始化数据库:

import { drizzle } from "drizzle-orm/vercel-postgres";
import { sql } from "@vercel/postgres";
import * as schema from "./schema";

export const db = drizzle(sql, { schema });

我注意到必须传入{ schema }参数才能实现TypeScript类型推断,以及使用schema中定义的ORM关系。

但之后我发现drizzle-kit的配置文件drizzle.config.ts也引用了schema:

import "@/lib/config";
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  schema: "./lib/schema.ts",
  out: "./drizzle",
  driver: "pg",
  dbCredentials: {
    connectionString: process.env.POSTGRES_URL,
  },
  verbose: true,
  strict: true,
});

我原本以为用了drizzle-kit就不用在drizzle(sql, { schema });里重复传schema参数,但实际并非如此。Drizzle文档提到:

Drizzle Kit lets you split your schema in different files and even have multiple schemas for different databases in one project. You can rapidly prototype database schema and push it directly to the database.

我尝试过直接导入config对象传入drizzle函数,比如:

import { sql } from "@vercel/postgres";
import { drizzle } from "drizzle-orm/vercel-postgres";
import { config } from "@/drizzle.config";

import { loadEnvConfig } from "@next/env";
const projectDir = process.cwd();
loadEnvConfig(projectDir);

export const db = drizzle(sql, config);

或者单独传入config里的schema:

import { sql } from "@vercel/postgres";
import { drizzle } from "drizzle-orm/vercel-postgres";
import { config } from "@/drizzle.config";

import { loadEnvConfig } from "@next/env";
const projectDir = process.cwd();
loadEnvConfig(projectDir);

export const db = drizzle(sql, {schema: config.schema});

但这两种方式都无效。想请教:为什么需要重复定义schema的位置?drizzle.config.ts的作用到底是什么?


解答

核心原因:Drizzle ORM与drizzle-kit是完全独立的工具

两者的定位和作用完全不同,所以需要分别配置schema:

  • drizzle.config.ts的作用:这是给drizzle-kit CLI工具用的配置文件。drizzle-kit负责数据库迁移管理、Schema与数据库同步、SQL代码生成等运维工作,它需要知道你的schema文件路径,才能读取Schema定义,生成迁移文件、对比数据库结构、执行迁移操作。它运行在Node.js CLI环境,和你的应用代码是分离的。
  • Drizzle ORM传入schema的作用:ORM是给应用业务代码用的,需要在运行时获取Schema的TypeScript类型信息和实体定义,才能提供类型安全的查询、ORM关联关系(比如一对一/一对多查询)等功能。这里传入的是实际导入的Schema对象(不是文件路径字符串),因为ORM需要直接引用这些实体来做类型推断和查询构建。

为什么你的尝试无效?

你直接导入drizzle.config.ts的配置传入ORM的原因有两个:

  1. drizzle.config.ts里的schema是文件路径字符串(比如"./lib/schema.ts"),而Drizzle ORM的drizzle函数需要的是导入的Schema对象(比如import * as schema from "./schema"),两者类型完全不匹配。
  2. drizzle.config.ts的配置结构是给CLI工具设计的,和ORM初始化函数的参数结构完全不同,直接传入整个config对象自然无法被ORM识别。

正确的做法

必须在两个地方分别配置,它们的作用互不冲突:

  1. 在drizzle.config.ts中指定Schema的文件路径,让drizzle-kit能找到你的Schema定义,用于迁移等CLI操作。
  2. 在应用代码中导入实际的Schema对象,传入drizzle函数,让ORM获取类型信息和实体定义,提供类型安全的查询能力。

保持你最初的正确写法即可:

// 应用代码中的DB初始化
import { drizzle } from "drizzle-orm/vercel-postgres";
import { sql } from "@vercel/postgres";
import * as schema from "./schema";

export const db = drizzle(sql, { schema });
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  schema: "./lib/schema.ts",
  out: "./drizzle",
  driver: "pg",
  dbCredentials: {
    connectionString: process.env.POSTGRES_URL,
  },
  verbose: true,
  strict: true,
});

内容的提问来源于stack exchange,提问作者Paul Olle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 18:25:58