Zum Inhalt springen

Datenbankoptionen

EmDash unterstützt mehrere Datenbank-Backends. Wählen Sie die passende Option für Ihr Deployment-Ziel.

DatenbankAm besten geeignet fürDeployment
D1Cloudflare WorkersEdge, global verteilt
PostgreSQLProduktion Node.jsJede Plattform mit Postgres
libSQLRemote-DatenbankenEdge oder Node.js
SQLiteNode.js, lokale EntwicklungEinzelner Server

D1 ist Cloudflares serverlose SQLite-Datenbank. Verwenden Sie sie, wenn Sie auf Cloudflare Workers deployen.

astro.config.mjs
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
OptionTypStandardwertBeschreibung
bindingstring—D1-Bindungsname aus wrangler.jsonc
sessionstring"disabled"Lesereplikationsmodus (siehe unten)
bookmarkCookiestring"__ec_d1_bookmark"Cookie-Name für Session-Bookmarks
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db",
"database_id": "your-database-id"
}
]
}
Terminal-Fenster
wrangler d1 create emdash-db

D1 unterstützt Lesereplikation, um die Latenz für global verteilte Seiten zu verringern. Wenn aktiviert, werden Leseabfragen an nahegelegene Replikate weitergeleitet, anstatt immer die primäre Datenbank zu belasten.

EmDash verwendet die D1-Sessions-API, um das transparent zu verwalten. Aktivieren Sie sie mit der Option session:

astro.config.mjs
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
ModusVerhalten
"disabled"Keine Sessions. Alle Abfragen gehen an die primäre Datenbank. Standard.
"auto"Anonyme Anfragen lesen vom nächstgelegenen Replikat. Authentifizierte Benutzer erhalten “read-your-writes”-Konsistenz über Bookmark-Cookies.
"primary-first"Wie "auto", aber die erste Abfrage geht immer an die primäre Datenbank. Für Seiten mit sehr häufigen Schreibvorgängen verwenden.
  • Anonyme Besucher erhalten first-unconstrained: Lesezugriffe gehen an das nächstgelegene Replikat, um die Latenz gering zu halten. Da anonyme Benutzer nie schreiben, brauchen sie keine Konsistenzgarantien.
  • Authentifizierte Benutzer (Editoren, Autoren) erhalten bookmark-basierte Sessions. Nach einem Schreibvorgang stellt ein Bookmark-Cookie sicher, dass der nächste Request mindestens diesen Zustand sieht.
  • Schreibanfragen (POST, PUT, DELETE) starten immer bei der primären Datenbank.
  • Build-Zeit-Abfragen (Astro Content Collections) umgehen Sessions komplett und nutzen die primäre Datenbank direkt.

libSQL ist ein Fork von SQLite, der Remote-Verbindungen unterstützt. Verwenden Sie es, wenn Sie eine Remote-Datenbank ohne Cloudflare D1 benötigen.

astro.config.mjs
import { libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
}),
}),
],
});
OptionTypBeschreibung
urlstringDatenbank-URL (libsql://... oder file:...)
authTokenstringAuthentifizierungs-Token für Remote-Datenbanken (optional für lokal)

Verwenden Sie eine lokale libSQL-Datei während der Entwicklung:

database: libsql({ url: "file:./data.db" });

PostgreSQL wird für Node.js-Deployments unterstützt, die eine vollwertige relationale Datenbank benötigen.

astro.config.mjs
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});

Sie können sich mit einem Connection String oder einzelnen Parametern verbinden:

// Verbindungs-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,
});
OptionTypBeschreibung
connectionStringstringPostgreSQL-Verbindungs-URL
hoststringDatenbank-Host
portnumberDatenbank-Port
databasestringDatenbank-Name
userstringDatenbank-Benutzer
passwordstringDatenbank-Passwort
sslbooleanSSL aktivieren
pool.minnumberMinimale Pool-Verbindungen (Standard 0)
pool.maxnumberMaximale Pool-Verbindungen (Standard 10)

Der Adapter verwendet pg.Pool im Hintergrund. Passen Sie die Pool-Größe basierend auf Ihrem Deployment an:

database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});

SQLite mit better-sqlite3 ist die einfachste Option für Node.js-Deployments.

js title="astro.config.mjs"
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
OptionTypBeschreibung
urlstringDateipfad mit file:-Präfix

Die url muss mit file: beginnen:

// Relative path
database: sqlite({ url: "file:./data/emdash.db" });
// Absoluter Pfad
database: sqlite({ url: "file:/var/data/emdash.db" });
// Aus einer Umgebungsvariable
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });

EmDash verwaltet Migrationen automatisch für SQLite, libSQL und PostgreSQL. Für D1 führen Sie Migrationen über Wrangler aus.

Terminal-Fenster
npx emdash init --database ./data.db

Dieser Befehl:

  1. Erstellt die Datenbankdatei, falls erforderlich
  2. Führt alle ausstehenden Migrationen aus
  3. Meldet den aktuellen Migrationsstatus

Migrationen sind mit EmDash gebündelt. Um sie manuell auszuführen:

Terminal-Fenster
# SQLite/libSQL: Migrationen laufen automatisch
# D1: über Wrangler ausführen
wrangler d1 migrations apply DB

Verwenden Sie unterschiedliche Datenbanken pro Umgebung:

astro.config.mjs
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 basierend auf Umgebungsvariablen wechseln:

const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });