You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
2.4 KiB
Markdown
56 lines
2.4 KiB
Markdown
---
|
|
# quotesdb-osmv
|
|
title: '[TRIAGE] SQLx + workers-rs + Cloudflare D1 compatibility (known issues?)'
|
|
status: completed
|
|
type: task
|
|
priority: critical
|
|
created_at: 2026-03-10T23:32:11Z
|
|
updated_at: 2026-03-10T23:32:11Z
|
|
---
|
|
|
|
<context>
|
|
This is a triage decision ticket. It must be resolved before dependent implementation tickets can proceed.
|
|
</context>
|
|
|
|
<question>
|
|
SQLx + workers-rs + Cloudflare D1 compatibility: does SQLx work with the Cloudflare D1 driver in a workers-rs environment? D1 uses a non-standard connection protocol.
|
|
</question>
|
|
|
|
<options>
|
|
1. **SQLx with libsql (Turso)** — Turso provides a SQLx-compatible driver. Use for local dev; switch to D1 in production via a different connection string.
|
|
2. **workers-rs D1 bindings** — workers-rs provides native D1 bindings that bypass SQLx. Requires rewriting DB access without SQLx macros.
|
|
3. **SQLite over HTTP (Turso)** — use Turso in both dev and production (Turso cloud instead of D1). Avoids D1 entirely.
|
|
</options>
|
|
|
|
<decision>
|
|
**Option 2: workers-rs D1 bindings, extended with a `cfg(target_arch)`-based native path.**
|
|
|
|
SQLx is fundamentally incompatible with Cloudflare Workers/D1. D1 is accessed through the
|
|
workers-rs JavaScript binding layer (`worker::d1::D1Database`), not a TCP connection.
|
|
SQLx requires a TCP-based connection and its compile-time query macros cannot run in the
|
|
Workers/WASM build environment.
|
|
|
|
**Chosen architecture:**
|
|
- `#[cfg(target_arch = "wasm32")]` → workers-rs `D1Database` bindings (production)
|
|
- `#[cfg(not(target_arch = "wasm32"))]` → `rusqlite` + `tokio-rusqlite` (native dev/tests)
|
|
|
|
A `QuoteRepository` async trait provides a unified interface. Concrete type aliases
|
|
(`AppRepo`) avoid trait-object Send/Sync constraints in Axum handlers.
|
|
|
|
`cargo test` on the native host automatically selects the rusqlite path — no wrangler dev
|
|
or feature flags needed for integration tests.
|
|
|
|
The design doc's "Query layer: SQLx" is superseded. See implementation ticket 00aff0.
|
|
</decision>
|
|
|
|
<resolution>
|
|
- Implementation ticket created: **00aff0** — full plan for Repository trait + D1/rusqlite impls.
|
|
- Ticket a5049d (database connection module) updated — SQLx goal superseded.
|
|
- Ticket 1f5bb5 (Cargo.toml) updated — cfg-split dependency constraints corrected.
|
|
- Tickets a91260 and 2ab7a8 also resolved by this decision (see those tickets).
|
|
</resolution>
|
|
|
|
<commit>
|
|
`chore(quotesdb): resolve triage — sqlx-workersrs-cloudflare-d1-compatibility-known-issues`
|
|
</commit>
|