DrizzleORM v0.28.6 版本发布
2023年9月6日

变更

注意:MySQL `datetime` 类型在 `mode: 'date'` 模式下,现在将以 UTC 字符串形式存储日期,并以 UTC 形式检索数据,以与 MySQL 的 `datetime` 行为保持一致。如果您需要不同的行为并希望以其他方式处理 `datetime` 映射,请使用 `mode: 'string'` 或 自定义类型 实现。

查看 修复 MySQL 的日期时间映射 以获取实现细节

新功能

🎉 `LibSQL` 批量 API 支持

参考:https://docs.turso.tech/reference/client-access/javascript-typescript-sdk#execute-a-batch-of-statements

批量 API 使用示例

const batchResponse = await db.batch([
	db.insert(usersTable).values({ id: 1, name: 'John' }).returning({
		id: usersTable.id,
	}),
	db.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),
	db.query.usersTable.findMany({}),
	db.select().from(usersTable).where(eq(usersTable.id, 1)),
	db.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(
		usersTable,
	),
]);
type BatchResponse = [
	{
		id: number;
	}[],
	ResultSet,
	{
		id: number;
		name: string;
		verified: number;
		invitedBy: number | null;
	}[],
	{
		id: number;
		name: string;
		verified: number;
		invitedBy: number | null;
	}[],
	{
		id: number;
		invitedBy: number | null;
	}[],
];

所有可在 `db.batch` 中使用的构建器

`db.all()`,
`db.get()`,
`db.values()`,
`db.run()`,
`db.query.<table>.findMany()`,
`db.query.<table>.findFirst()`,
`db.select()...`,
`db.update()...`,
`db.delete()...`,
`db.insert()...`,

更多使用示例请参见:integration-tests/tests/libsql-batch.test.ts文档

🎉 在 SQLite 中为文本添加 JSON 模式

更多信息请参见 文档

const test = sqliteTable('test', {
	dataTyped: text('data_typed', { mode: 'json' }).$type<{ a: 1 }>().notNull(),
});

🎉 为关系查询 API 调用添加 `.toSQL()` 方法

const query = db.query.usersTable.findFirst().toSQL();

🎉 添加了新的 PostgreSQL 数组运算符

运算符列表及使用示例:`arrayContains`、`arrayContained`、`arrayOverlaps`

更多信息请参见 文档

const contains = await db.select({ id: posts.id }).from(posts)
	.where(arrayContains(posts.tags, ['Typescript', 'ORM']));

const contained = await db.select({ id: posts.id }).from(posts)
	.where(arrayContained(posts.tags, ['Typescript', 'ORM']));

const overlaps = await db.select({ id: posts.id }).from(posts)
	.where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']));

const withSubQuery = await db.select({ id: posts.id }).from(posts)
	.where(arrayContains(
		posts.tags,
		db.select({ tags: posts.tags }).from(posts).where(eq(posts.id, 1)),
	));

🎉 在关系查询中为 where 筛选函数添加更多 SQL 运算符

更多示例请参见 文档

// Before
import { inArray } from "drizzle-orm/pg-core";

await db.users.findFirst({
  where: (table, _) => inArray(table.id, [ ... ])
})
// After
await db.users.findFirst({
  where: (table, { inArray }) => inArray(table.id, [ ... ])
})

修复