EmDash unterstützt mehrere Datenbank-Backends. Wählen Sie basierend auf Ihrem Deployment-Ziel.
Überblick
| Datenbank | Am besten für | Deployment |
|---|---|---|
| D1 | Cloudflare Workers | Edge, global verteilt |
| PostgreSQL | Produktions-Node.js | Jede Plattform mit Postgres |
| libSQL | Remote-Datenbanken | Edge oder Node.js |
| SQLite | Node.js, lokale Entwicklung | Einzelner Server |
Cloudflare D1
D1 ist Cloudflares serverlose SQLite-Datenbank. Verwenden Sie sie beim Deployment auf Cloudflare Workers.
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
Konfiguration
| Option | Typ | Standard | Beschreibung |
|---|---|---|---|
binding | string | — | D1-Binding-Name aus wrangler.jsonc |
session | string | "disabled" | Lese-Replikationsmodus (siehe unten) |
bookmarkCookie | string | "__em_d1_bookmark" | Cookie-Name für Sitzungs-Bookmarks |
Einrichtung
wrangler.jsonc
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db",
"database_id": "your-database-id"
}
]
} wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "emdash-db"
database_id = "your-database-id" D1-Datenbank erstellen
wrangler d1 create emdash-db
Lese-Replikas
D1 unterstützt Lese-Replikation, um die Lese-Latenz für global verteilte Sites zu senken. Wenn aktiviert, werden Lese-Queries zu nahen Replikas geroutet, anstatt immer die primäre Datenbank zu erreichen.
EmDash verwendet die D1 Sessions API, um dies transparent zu verwalten. Aktivieren Sie sie mit der session-Option:
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
Sitzungsmodi
| Modus | Verhalten |
|---|---|
"disabled" | Keine Sitzungen. Alle Queries gehen zum Primary. Standard. |
"auto" | Anonyme Anfragen lesen vom nächsten Replika. Authentifizierte Benutzer erhalten Read-Your-Writes-Konsistenz via Bookmark-Cookies. |
"primary-first" | Wie "auto", aber die erste Query geht immer zum Primary. Verwenden Sie dies für Sites mit sehr häufigen Schreibvorgängen. |
Wie es funktioniert
- Anonyme Besucher erhalten
first-unconstrained— Lesevorgänge gehen zum nächsten Replika für die niedrigste Latenz. Da anonyme Benutzer nie schreiben, benötigen sie keine Konsistenzgarantien. - Authentifizierte Benutzer (Editoren, Autoren) erhalten Bookmark-basierte Sitzungen. Nach einem Schreibvorgang stellt ein Bookmark-Cookie sicher, dass die nächste Anfrage mindestens diesen Zustand sieht.
- Schreibanfragen (
POST,PUT,DELETE) starten immer bei der primären Datenbank. - Build-Zeit-Queries (Astro Content Collections) umgehen Sitzungen vollständig und verwenden den Primary direkt.
libSQL
libSQL ist ein Fork von SQLite, der Remote-Verbindungen unterstützt. Verwenden Sie es, wenn Sie eine Remote-Datenbank ohne Cloudflare D1 benötigen.
import { libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
}),
}),
],
});
Konfiguration
| Option | Typ | Beschreibung |
|---|---|---|
url | string | Datenbank-URL (libsql://... oder file:...) |
authToken | string | Auth-Token für Remote-Datenbanken (optional für lokal) |
Lokale Entwicklung
Verwenden Sie während der Entwicklung eine lokale libSQL-Datei:
database: libsql({ url: "file:./data.db" });
PostgreSQL
PostgreSQL wird für Node.js-Deployments unterstützt, die eine vollständige relationale Datenbank benötigen.
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
Konfiguration
Sie können mit einem Connection String oder einzelnen Parametern verbinden:
// Connection String
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Einzelne Parameter
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| Option | Typ | Beschreibung |
|---|---|---|
connectionString | string | PostgreSQL-Verbindungs-URL |
host | string | Datenbank-Host |
port | number | Datenbank-Port |
database | string | Datenbankname |
user | string | Datenbankbenutzer |
password | string | Datenbankpasswort |
ssl | boolean | SSL aktivieren |
pool.min | number | Minimum Pool-Verbindungen (Standard 0) |
pool.max | number | Maximum Pool-Verbindungen (Standard 10) |
Connection Pooling
Der Adapter verwendet pg.Pool intern. Passen Sie die Pool-Größe basierend auf Ihrem Deployment an:
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
SQLite mit better-sqlite3 ist die einfachste Option für Node.js-Deployments.
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
Konfiguration
| Option | Typ | Beschreibung |
|---|---|---|
url | string | Dateipfad mit file:-Präfix |
Dateipfad
Die url muss mit file: beginnen:
// Relativer Pfad
database: sqlite({ url: "file:./data/emdash.db" });
// Absoluter Pfad
database: sqlite({ url: "file:/var/data/emdash.db" });
// Aus Umgebungsvariable
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
Migrationen
EmDash verwaltet Migrationen automatisch für SQLite, libSQL und PostgreSQL. Für D1 führen Sie Migrationen über Wrangler aus.
Migrationsstatus prüfen
npx emdash init --database ./data.db
Dieser Befehl:
- Erstellt die Datenbankdatei bei Bedarf
- Führt ausstehende Migrationen aus
- Meldet den aktuellen Migrationsstatus
Migrationsdateien
Migrationen sind mit EmDash gebündelt. Um sie manuell auszuführen:
# SQLite/libSQL - Migrationen laufen automatisch
# D1 - über wrangler ausführen
wrangler d1 migrations apply DB
Umgebungsbasierte Konfiguration
Verwenden Sie verschiedene Datenbanken pro Umgebung:
import { sqlite, libsql, postgres } from "emdash/db";
import { d1 } from "@emdash-cms/cloudflare";
const database = import.meta.env.PROD ? d1({ binding: "DB" }) : sqlite({ url: "file:./data.db" });
export default defineConfig({
integrations: [emdash({ database })],
});
Oder wechseln Sie basierend auf Umgebungsvariablen:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });