Drizzle ORM 和 Drizzle Kit v1.0.0-beta.2 发布
Feb 12, 2025

我们在此版本引入了大量更改,某些功能肯定会出现兼容性问题。如果遇到任何问题,您可以降级到版本 1.0.0-beta.10.44.7,并请在 GitHub 或我们的 Discord 上反馈问题!

别忘了查看 1.0.0-beta.1 版本的更新说明:https://github.com/drizzle-team/drizzle-orm/blob/beta/changelogs/drizzle-orm/1.0.0-beta.1.md

查看 RQBv1 到 RQBv2 迁移步骤的迁移指南:https://orm.drizzle.team/docs/relations-v1-v2

查看新的 RQBv2 架构文档:https://orm.drizzle.team/docs/relations-v2

查看新的 RQBv2 查询文档:https://orm.drizzle.team/docs/rqb-v2

新功能

MSSQL 方言

Drizzle 当前支持 MSSQL 语法,涵盖了 drizzle-ormdrizzle-kitdrizzle-seed 包。支持大部分列类型、查询构造器功能、迁移策略等。

唯一还不支持的功能是 RQBv2

// 确保安装了 'mssql' 包 
import { drizzle } from 'drizzle-orm/node-mssql';

const db = drizzle(process.env.DATABASE_URL);
 
const result = await db.execute('select 1');
// 确保安装了 'pg' 包 
import { drizzle } from 'drizzle-orm/node-mssql';

// 你可以指定 mssql 连接选项里的任意属性
const db = drizzle({ 
  connection: { 
    connectionString: process.env.DATABASE_URL,
    ssl: true
  }
});
 
const result = await db.execute('select 1');

CockroachDB 方言

Drizzle 当前支持 CockroachDB,涵盖了 drizzle-ormdrizzle-kitdrizzle-seed 包。支持大部分列类型、查询构造器功能、迁移策略等。

唯一还不支持的功能是 RQBv2

// 确保安装了 'pg' 包 
import { drizzle } from 'drizzle-orm/cockroach';

const db = drizzle(process.env.DATABASE_URL);
 
const result = await db.execute('select 1');
// 确保安装了 'pg' 包 
import { drizzle } from 'drizzle-orm/cockroach';

// 你可以指定 node-postgres 连接选项里的任意属性
const db = drizzle({ 
  connection: { 
    connectionString: process.env.DATABASE_URL,
    ssl: true
  }
});
 
const result = await db.execute('select 1');

关系查询部分 (Relational Query Parts)

如果你需要将关系配置拆分成多个部分,可以使用 defineRelationsPart 辅助函数

import { defineRelations, defineRelationsPart } from 'drizzle-orm';
import * as schema from "./schema";
export const relations = defineRelations(schema, (r) => ({
  users: {
    invitee: r.one.users({
      from: r.users.invitedBy,
      to: r.users.id,
    }),
    posts: r.many.posts(),
  }
}));
export const part = defineRelationsPart(schema, (r) => ({
  posts: {
    author: r.one.users({
      from: r.posts.authorId,
      to: r.users.id,
    }),
  }
}));

然后可以将它们传递给数据库实例

const db = drizzle(process.env.DB_URL, { relations: { ...relations, ...part } })

Folders v3 迁移

相关讨论:https://github.com/drizzle-team/drizzle-orm/discussions/2832

我们更新了迁移文件夹结构,主要有:

这些改动避免了 journal 文件产生潜在的 Git 冲突,并简化了删除或修复冲突迁移的流程。

在后续的 beta 版本中,我们将加入交换律检查,帮助指导团队处理迁移冲突,检测可能的冲突点,并给出解决建议。

交换律讨论:https://github.com/drizzle-team/drizzle-orm/discussions/5005

将之前的文件夹迁移到新格式,您可以执行以下命令:

drizzle-kit up

全新重写的 drizzle-kit

架构重写,旨在解决主要的 kit 和迁移问题。我们完成了一系列有价值且必要的更新,帮助加速迭代、提升测试覆盖率并增强整体稳定性。

主要工作总结:

新增 drizzle-kit pull --init

该命令会在数据库中创建 drizzle 迁移表,并将首次拉取的迁移标记为已应用,从而让你可以基于此继续迭代。

schemaFilter 行为更新

drizzle-kit 开始管理代码中定义的所有 schema。如果你想过滤它们,可以使用 schemaFilter
之前,默认只管理 public schema,除非显式添加更多 schema 到 schemaFilter

现在它还支持通配符模式,允许你按任意方式过滤 schema。

.enableRLS() 弃用

之前在 PostgreSQL 表上启用行级安全 (RLS),需要这样写:

// 旧语法
pgTable('name', {}).enableRLS()

这一选项现已迁移到新位置

pgTable.withRLS('users', {});

列上直接设定别名

你现在可以简单地为列添加 as 别名:

const query = db
	.select({ age: users.age.as('ageOfUser'), id: users.id.as('userId') })
	.from(users)
	.orderBy(asc(users.id.as('userId')));

MySQL 新增列类型

新增了以下几种 MySQL 列类型:

其他更新和修复

修复的 Bug

该列表尚不完整,我们仅整理了部分问题。未来几周内还会持续更新。