# Cloudflare D1 & KV ## D1 (SQLite Database) ### Setup ```bash # Create database wrangler d1 create my-database # Add to wrangler.toml [[d1_databases]] binding = "DB" database_name = "my-database" database_id = "YOUR_DATABASE_ID" # Apply schema wrangler d1 execute my-database --file=./schema.sql ``` ### Usage ```typescript // Query const result = await env.DB.prepare( "SELECT * FROM users WHERE id = ?" ).bind(userId).first(); // Insert await env.DB.prepare( "INSERT INTO users (name, email) VALUES (?, ?)" ).bind("Alice", "alice@example.com").run(); // Batch (atomic) await env.DB.batch([ env.DB.prepare("UPDATE accounts SET balance = balance - 100 WHERE id = ?").bind(user1), env.DB.prepare("UPDATE accounts SET balance = balance + 100 WHERE id = ?").bind(user2) ]); // All results const { results } = await env.DB.prepare("SELECT * FROM users").all(); ``` ### Features - Global read replication (low-latency reads) - Single-writer consistency - Standard SQLite syntax - 25GB database size limit - ACID transactions with batch ## KV (Key-Value Store) ### Setup ```bash # Create namespace wrangler kv:namespace create MY_KV # Add to wrangler.toml [[kv_namespaces]] binding = "KV" id = "YOUR_NAMESPACE_ID" ``` ### Usage ```typescript // Put with TTL await env.KV.put("session:token", JSON.stringify(data), { expirationTtl: 3600, metadata: { userId: "123" } }); // Get const value = await env.KV.get("session:token"); const json = await env.KV.get("session:token", "json"); const buffer = await env.KV.get("session:token", "arrayBuffer"); const stream = await env.KV.get("session:token", "stream"); // Get with metadata const { value, metadata } = await env.KV.getWithMetadata("session:token"); // Delete await env.KV.delete("session:token"); // List const list = await env.KV.list({ prefix: "user:" }); ``` ### Features - Sub-millisecond reads (edge-cached) - Eventual consistency (~60 seconds globally) - 25MB value size limit - Automatic expiration (TTL) ## Use Cases ### D1 - Relational data - Complex queries with JOINs - ACID transactions - User accounts, orders, inventory ### KV - Cache - Sessions - Feature flags - Rate limiting - Real-time counters ## Decision Matrix | Need | Choose | |------|--------| | SQL queries | D1 | | Sub-millisecond reads | KV | | ACID transactions | D1 | | Large values (>25MB) | R2 | | Strong consistency | D1 (writes), Durable Objects | | Automatic expiration | KV | ## Resources - D1: https://developers.cloudflare.com/d1/ - KV: https://developers.cloudflare.com/kv/