DrizzleORM v0.29.5 发布
Mar 6, 2024

新功能

🎉 WITH UPDATE、WITH DELETE、WITH INSERT

现在可以在 INSERT、UPDATE 和 DELETE 语句中使用 WITH 子句。

使用示例

const averageAmount = db.$with('average_amount').as(
  db.select({ value: sql`avg(${orders.amount})`.as('value') }).from(orders),
);

const result = await db
  .with(averageAmount)
  .delete(orders)
  .where(gt(orders.amount, sql`(select * from ${averageAmount})`))
  .returning({
    id: orders.id,
  });
with "average_amount" as (select avg("amount") as "value" from "orders") 
delete from "orders" 
where "orders"."amount" > (select * from "average_amount") 
returning "id";

有关所有语句的更多示例,请查阅文档:

🎉 可以指定自定义架构和迁移表名称

  • 自定义迁移表

默认情况下,所有执行的迁移信息将存储在数据库的 __drizzle_migrations 表中, 对于 PostgreSQL,还会存储在 drizzle 架构中。但是,您可以配置将这些记录存储在其他位置。

要为存储在数据库中的迁移信息添加自定义表名称,您可以使用 migrationsTable 选项。

使用示例

await migrate(db, {
  migrationsFolder: './drizzle',
  migrationsTable: 'my_migrations',
});
  • 自定义架构

仅适用于 PostgreSQL 数据库

要为存储在数据库中的迁移信息添加自定义架构名称,您可以使用 migrationsSchema 选项。

使用示例

await migrate(db, {
  migrationsFolder: './drizzle',
  migrationsSchema: 'custom',
});

🎉 支持 SQLite 代理批处理和关系查询

有关 SQLite 代理的更多信息,请查阅文档

  • 您现在可以在使用 SQLite 代理驱动程序时使用 .query.findFirst.query.findMany 语法。

  • SQLite 代理支持批处理请求,与其他所有驱动程序一样。请查阅完整的文档

    您需要为批处理查询指定特定的回调函数,并处理对代理服务器的请求:

import { drizzle } from 'drizzle-orm/sqlite-proxy';

type ResponseType = { rows: any[][] | any[] }[];

const db = drizzle(
  async (sql, params, method) => {
    // 单个查询逻辑
  },
  // 新的批处理回调
  async (
    queries: {
      sql: string;
      params: any[];
      method: 'all' | 'run' | 'get' | 'values';
    }[],
  ) => {
    try {
      const result: ResponseType = await axios.post(
        'http://localhost:3000/batch',
        { queries },
      );

      return result;
    } catch (e: any) {
      console.error('来自 SQLite 代理服务器的错误:', e);
      throw e;
    }
  },
);

然后,您可以使用 db.batch([]) 方法代理所有查询。

批处理的响应应该是一个原始值的数组(数组内嵌套数组),顺序与发送到代理服务器的顺序相同。

Become a Gold Sponsor