From aabb49becb7be1857eaaf6086f910c93b0e56998 Mon Sep 17 00:00:00 2001 From: coyaSONG <66289470+coyaSONG@users.noreply.github.com> Date: Fri, 17 Jul 2026 11:26:59 +0900 Subject: [PATCH] fix(sql-drizzle): support sqlite batches --- .changeset/small-batches-smile.md | 5 +++++ packages/sql-drizzle/src/Sqlite.ts | 16 +++++++++++++--- packages/sql-drizzle/test/Sqlite.test.ts | 17 +++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 .changeset/small-batches-smile.md diff --git a/.changeset/small-batches-smile.md b/.changeset/small-batches-smile.md new file mode 100644 index 00000000000..945a61cca86 --- /dev/null +++ b/.changeset/small-batches-smile.md @@ -0,0 +1,5 @@ +--- +"@effect/sql-drizzle": patch +--- + +Support `db.batch` with the SQLite Drizzle integration. diff --git a/packages/sql-drizzle/src/Sqlite.ts b/packages/sql-drizzle/src/Sqlite.ts index 907d3fc297b..4b8ab113208 100644 --- a/packages/sql-drizzle/src/Sqlite.ts +++ b/packages/sql-drizzle/src/Sqlite.ts @@ -6,13 +6,21 @@ import type { SqlError } from "@effect/sql/SqlError" import type { DrizzleConfig } from "drizzle-orm" import { QueryPromise } from "drizzle-orm/query-promise" import { SQLiteSelectBase } from "drizzle-orm/sqlite-core" -import type { SqliteRemoteDatabase } from "drizzle-orm/sqlite-proxy" +import type { AsyncBatchRemoteCallback, AsyncRemoteCallback, SqliteRemoteDatabase } from "drizzle-orm/sqlite-proxy" import { drizzle } from "drizzle-orm/sqlite-proxy" import * as Context from "effect/Context" import * as Effect from "effect/Effect" import * as Layer from "effect/Layer" import { makeRemoteCallback, patch } from "./internal/patch.js" +const makeRemoteBatchCallback = (callback: AsyncRemoteCallback): AsyncBatchRemoteCallback => async (queries) => { + const results = [] + for (const query of queries) { + results.push(await callback(query.sql, query.params, query.method)) + } + return results +} + /** * @since 1.0.0 * @category constructors @@ -21,7 +29,8 @@ export const make = = Record, "logger"> ): Effect.Effect, never, Client.SqlClient> => Effect.gen(function*() { - const db = drizzle(yield* makeRemoteCallback, config) + const callback = yield* makeRemoteCallback + const db = drizzle(callback, makeRemoteBatchCallback(callback), config) return db }) @@ -33,7 +42,8 @@ export const makeWithConfig: (config: DrizzleConfig) => Effect.Effect Effect.gen(function*() { - const db = drizzle(yield* makeRemoteCallback, config) + const callback = yield* makeRemoteCallback + const db = drizzle(callback, makeRemoteBatchCallback(callback), config) return db }) diff --git a/packages/sql-drizzle/test/Sqlite.test.ts b/packages/sql-drizzle/test/Sqlite.test.ts index 984683ff62b..92c5acc2926 100644 --- a/packages/sql-drizzle/test/Sqlite.test.ts +++ b/packages/sql-drizzle/test/Sqlite.test.ts @@ -55,6 +55,23 @@ describe("SqliteDrizzle", () => { assert.deepStrictEqual(results, [{ id: 1, name: "Alice", snakeCase: "snake" }]) }).pipe(Effect.provide(ORM.Client))) + it.effect("batch", () => + Effect.gen(function*() { + const sql = yield* SqlClient.SqlClient + const db = yield* SqliteDrizzle.SqliteDrizzle + yield* sql`CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, snake_case TEXT)` + const results = yield* Effect.promise(() => + db.batch([ + db.insert(users).values({ name: "Alice", snakeCase: "snake" }).returning(), + db.select().from(users) + ]) + ) + assert.deepStrictEqual(results, [ + [{ id: 1, name: "Alice", snakeCase: "snake" }], + [{ id: 1, name: "Alice", snakeCase: "snake" }] + ]) + }).pipe(Effect.provide(SqliteDrizzleLive))) + it.effect("remote callback", () => Effect.gen(function*() { const sql = yield* SqlClient.SqlClient