d1Executor
A SqlExecutor over Cloudflare's D1, implementing the asynchronous half of the port that Alchemy's D1 executor implements (@alchemy.run/cloudflare/D1/ApplyMigrations, makeD1MigrationExecutor): query/get for reads, write/batch for writes, and atomic for a unit.
Source:
packages/paykit/src/Store/D1.tsKind: Primitive
A SqlExecutor over Cloudflare’s D1, implementing the asynchronous half of
the port that Alchemy’s D1 executor implements
(@alchemy.run/cloudflare/D1/ApplyMigrations, makeD1MigrationExecutor):
query/get for reads, write/batch for writes, and atomic for a unit.
D1 has no interactive transaction and no isolation between a read and a
commit, so atomic collects the unit’s writes and commits them in one
batch call — the closest thing the platform offers, and what Alchemy’s own
driver does for D1. isolation says "deferred" so a store that needs more
can refuse rather than assume.
The synchronous half refuses with an error naming the constraint rather than blocking a request thread that cannot block.
Reaching D1 from a Worker
const sql = Paykit.d1Executor(env.BILLING);
yield* sql.atomic(
Effect.gen(function* () {
yield* sql.write("INSERT INTO billing_event (…) VALUES (?, ?, …)", [...]);
yield* sql.write("INSERT INTO billing_state (…) VALUES (?, ?, ?)", [...]);
}),
);