124 lines
2.5 KiB
Markdown
124 lines
2.5 KiB
Markdown
# 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/
|