DrizzleORM v0.28.6 发布
Sep 6, 2023

修改

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

有关实现细节,请参见修复 MySQL 的 Datetime 映射

新功能

🎉 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();

🎉 为 Arrays 添加新的 PostgreSQL 操作符

操作符列表和使用示例 arrayContainsarrayContainedarrayOverlaps

文档中了解更多信息

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, [ ... ])
})

修复

  • 在 SQLite 中正确处理冲突位置(#1076
  • 修正了 libsql/client 类型导入(#1122
  • 修复了在 RDS 上不正确映射原始 SQL 查询的问题(#1071
  • 修复了 MySQL 的 Datetime 映射(#1082
  • 修复了 smallserial 生成为 serial 的问题(#1127
Become a Gold Sponsor