Comments (8)
Use the Batch API to achieve 'transactions' in Cloudflare D1
const batchResponse: 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),
]);
from drizzle-orm.
@emmanuelchucks unfortunately, this workaround will not work in some scenarios like the following:
const [createdUser] = await global.db
.insert(users)
.values({
name: account.name
})
.returning({
id: users.id
});
// It may fail if the account already exists,
// in this case I want to rollback the transaction, removing the previously inserted user
const [createdAccount] = await global.db
.insert(accounts)
.values({
userId: createdUser.id, // I need to know the id returned from the previous query
provider: account.provider,
providerAccountId: account.providerAccountId,
})
.returning();
from drizzle-orm.
@emmanuelchucks unfortunately, this workaround will not work in some scenarios like the following:
const [createdUser] = await global.db .insert(users) .values({ name: account.name }) .returning({ id: users.id }); // It may fail if the account already exists, // in this case I want to rollback the transaction, removing the previously inserted user const [createdAccount] = await global.db .insert(accounts) .values({ userId: createdUser.id, // I need to know the id returned from the previous query provider: account.provider, providerAccountId: account.providerAccountId, }) .returning();
@duducpp It's the drawback of Cloudflare D1 rather than drizzle. Even if you switch to prisma, this transaction feature is still unsupported. They (cloudflare team) have a workaround may help you: https://blog.cloudflare.com/whats-new-with-d1
from drizzle-orm.
facing same error how could i fix these?
from drizzle-orm.
This is a curious situation where batch is not a true workaround, as one action against the database in a batch "tx" may have return data needed for the following action in the batch call.
from drizzle-orm.
@emmanuelchucks unfortunately, this workaround will not work in some scenarios like the following:
const [createdUser] = await global.db .insert(users) .values({ name: account.name }) .returning({ id: users.id }); // It may fail if the account already exists, // in this case I want to rollback the transaction, removing the previously inserted user const [createdAccount] = await global.db .insert(accounts) .values({ userId: createdUser.id, // I need to know the id returned from the previous query provider: account.provider, providerAccountId: account.providerAccountId, }) .returning();@duducpp It's the drawback of Cloudflare D1 rather than drizzle. Even if you switch to prisma, this transaction feature is still unsupported. They (cloudflare team) have a workaround may help you: https://blog.cloudflare.com/whats-new-with-d1
This is the only workaround, thanks for the tip.
from drizzle-orm.
@duducpp I did see this last night as well: https://blog.cloudflare.com/whats-new-with-d1
Are you aware if we can instead of workers-qb
, use drizzle
in this pattern? I reached out to the authors as well.
from drizzle-orm.
Cloudflare never shipped the stored procedure feature mentioned in that blog post. It was just something they were looking into at the time. See here: https://community.cloudflare.com/t/d1-stored-procedures-can-not-use/649207
from drizzle-orm.
Related Issues (20)
- [BUG]: drizzle-orm dependency missing in drizzle-kit HOT 1
- [FEATURE]: Auto-Alias Columns in Subqueries
- [BUG]: drizzle-kit introspect casing "preserve" config not working
- [FEATURE]: add luxon datetime mode to timestamp columns
- [BUG]: string values for limit causes issues but for offset they are ok HOT 1
- [FEATURE]: Join type in query system when foreign key is nullable
- [BUG]: "Offset is outside the bounds of the DataView" when querying PgGeometry field via RQB relation HOT 1
- [BUG]: `drizzle-kit push --force` fails if `__old_push_table` doesn't exist
- [BUG]:isNotNull doesn't work with and statement that searches for a varchar with - HOT 1
- [FEATURE]: Ability to get info on migration status & if db can be migrated
- [BUG]: Not inferring types properly with typescript & turborepo HOT 1
- [FEATURE]: sqlx-ts integration for magic sql operator
- [BUG]: I get `cannot insert multiple commands into a prepared statement` when migrations more than one HOT 1
- [BUG]: ALTER TABLE Migration Fails to Preserve Default Value for Column
- [BUG]: permission denied for view pg_buffercache
- [BUG]:with clouse in query return never
- [FEATURE]: support const enums
- [BUG]: Issue with SQL generation. Trying to reference a type that doesn't exist?
- [BUG]: No warning or error when performing a migration with duplicate table columns
- [BUG]: pg geometry is preventing migration
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from drizzle-orm.