Datenbankoptionen

Auf dieser Seite

EmDash unterstützt mehrere Datenbank-Backends. Wählen Sie basierend auf Ihrem Deployment-Ziel.

Überblick

DatenbankAm besten fürDeployment
D1Cloudflare WorkersEdge, global verteilt
PostgreSQLProduktions-Node.jsJede Plattform mit Postgres
libSQLRemote-DatenbankenEdge oder Node.js
SQLiteNode.js, lokale EntwicklungEinzelner 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

OptionTypStandardBeschreibung
bindingstringD1-Binding-Name aus wrangler.jsonc
sessionstring"disabled"Lese-Replikationsmodus (siehe unten)
bookmarkCookiestring"__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

ModusVerhalten
"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

OptionTypBeschreibung
urlstringDatenbank-URL (libsql://... oder file:...)
authTokenstringAuth-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,
});
OptionTypBeschreibung
connectionStringstringPostgreSQL-Verbindungs-URL
hoststringDatenbank-Host
portnumberDatenbank-Port
databasestringDatenbankname
userstringDatenbankbenutzer
passwordstringDatenbankpasswort
sslbooleanSSL aktivieren
pool.minnumberMinimum Pool-Verbindungen (Standard 0)
pool.maxnumberMaximum 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

OptionTypBeschreibung
urlstringDateipfad 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:

  1. Erstellt die Datenbankdatei bei Bedarf
  2. Führt ausstehende Migrationen aus
  3. 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" });