Skip to main content

Cloudflare D1 Considerations

Repositories must account for Cloudflare D1 limitations.

No Transactions

Since D1 doesn't support transactions, repositories use sequential operations:

async createWithRelated(mainData, relatedData) {
const main = await this.db.insert(mainTable).values(mainData).returning();
const related = await this.db.insert(relatedTable).values({
...relatedData,
mainId: main[0].id,
}).returning();
return { main: main[0], related: related[0] };
}

Batch Operations

Large operations are batched:

const BATCH_SIZE = 100;
for (let i = 0; i < items.length; i += BATCH_SIZE) {
await this.db.insert(table).values(items.slice(i, i + BATCH_SIZE));
}

See Cloudflare D1 Limitations for more details.