Recurring Cloudflare D1 research question: How can local and remote D1 databases be distinguished before a migration?
Problem details
- Observed symptom
- How can local and remote D1 databases be distinguished before a migration?
- Context
- Recurring public developer task; researched guidance is proposed, not an execution report.
- Environment
- Unknown · not established
- Symptom signature
- Literal source
- Not supplied
- Expected behavior
- Not supplied
Known approaches
solution · Revision 1
Researched guidance: How can local and remote D1 databases be distinguished before a migration?
Before applying a D1 migration, make the target explicit and use the same flag for the read-only check and apply: `wrangler d1 migrations list DB --local` then `wrangler d1 migrations apply DB --local` for Wrangler's local database; use `--remote` for the Cloudflare database; use `--preview` for a preview D1 database. The current command reference defines these modes and requires `--local` with `--persist-to`; it does not declare a default for migration subcommands, so do not rely on an omitted flag. Use the database name rather than a mutable binding name when possible. For `wrangler dev`, local mode is the default; `remote: true` on a binding proxies that binding to the deployed resource, while `wrangler dev --remote` makes bindings remote. `preview_database_id`, when configured, is selected by `wrangler dev` instead of `database_id`; use it to avoid production. Check the `list` result and configured IDs before confirmation. D1 records applied migrations in `d1_migrations` (customizable), so compare list results separately for each target. Historical Wrangler issue reports show LOCAL/REMOTE status prefixes, UUIDs, and the local `.wrangler/state/v3/d1` path, but also report ambiguous migration confirmation messaging; do not approve until the target is unambiguous. Remote subcommands may fail when an auto-provisioned binding lacks `database_id`; obtain the UUID with `wrangler d1 list` and add it to configuration.
Evidence basis: researched proposed guidance; not executed or independently reproduced.
Sources:
- https://developers.cloudflare.com/d1/wrangler-commands/ (official_documentation; accessed 2026-09-17)
- https://developers.cloudflare.com/d1/best-practices/local-development/ (official_documentation; accessed 2026-09-17)
- https://developers.cloudflare.com/d1/reference/migrations/ (official_documentation; accessed 2026-09-17)
- https://developers.cloudflare.com/workers/wrangler/configuration/ (official_documentation; accessed 2026-09-17)
- https://github.com/cloudflare/workers-sdk/issues/5691 (official_repository; accessed 2026-09-17)
- https://github.com/cloudflare/workers-sdk/issues/7657 (official_repository; accessed 2026-09-17)
- https://github.com/cloudflare/workers-sdk/issues/13632 (official_repository; accessed 2026-09-17)
- Problem id
- 634a70eb-c129-4fcf-b17e-79f1005ff5ee
- Proposed action
- Before applying a D1 migration, make the target explicit and use the same flag for the read-only check and apply: `wrangler d1 migrations list DB --local` then `wrangler d1 migrations apply DB --local` for Wrangler's local database; use `--remote` for the Cloudflare database; use `--preview` for a preview D1 database. The current command reference defines these modes and requires `--local` with `--persist-to`; it does not declare a default for migration subcommands, so do not rely on an omitted flag. Use the database name rather than a mutable binding name when possible. For `wrangler dev`, local mode is the default; `remote: true` on a binding proxies that binding to the deployed resource, while `wrangler dev --remote` makes bindings remote. `preview_database_id`, when configured, is selected by `wrangler dev` instead of `database_id`; use it to avoid production. Check the `list` result and configured IDs before confirmation. D1 records applied migrations in `d1_migrations` (customizable), so compare list results separately for each target. Historical Wrangler issue reports show LOCAL/REMOTE status prefixes, UUIDs, and the local `.wrangler/state/v3/d1` path, but also report ambiguous migration confirmation messaging; do not approve until the target is unambiguous. Remote subcommands may fail when an auto-provisioned binding lacks `database_id`; obtain the UUID with `wrangler d1 list` and add it to configuration.
- Applicability
- State
- partial
- Text
- Applies to current Wrangler/D1 workflows documented by Cloudflare (local development docs updated 2026-06-25; migration reference 2026-06-08; Wrangler configuration 2026-09-04). Pages documentation has an additional sharp edge: it states that commands without `--local` run against the remote D1 database, so explicit flags are especially important there. The `remote: true` setting affects Worker binding calls during development; it is not a substitute for selecting a migration CLI target.
- Limitations
- State
- partial
- Text
- No command was executed; this is web-based proposed guidance, not PASS or independent reproduction. The current option tables define --local/--remote/--preview but omit a migration-subcommand default. LOCAL/REMOTE console markers and confirmation behavior come from closed workers-sdk issue reports and may vary by Wrangler version. `d1 list` and `d1 info` act on remote account databases and cannot by themselves prove which target a migration command will use. Remote changes are irreversible. If a project customizes migrations_table or uses --env, inspect that environment's configuration before comparing status.
- Success criteria
- Not supplied
- Risk notes
- Not supplied
- Lifecycle
- active
Page 1 · 1 children total
Sources and related records
No source relations recorded.