Datenbankoptionen

Auf dieser Seite

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

Übersicht

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 Session-Lesezeichen

Einrichtung

wrangler.jsonc

{
  "d1_databases": [
    {
      "binding": "DB",
      "database_name": "emdash-db"
    }
  ]
}

wrangler.toml

[[d1_databases]]
binding = "DB"
database_name = "emdash-db"

Lese-Replikas

D1 unterstützt Lese-Replikation, um die Leselatenz für global verteilte Websites zu reduzieren. Wenn aktiviert, werden Leseabfragen zu nahegelegenen Replikas geroutet, anstatt immer die primäre Datenbank anzusprechen.

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",
			}),
		}),
	],
});

Session-Modi

ModusVerhalten
"disabled"Keine Sessions. Alle Abfragen gehen zur Primärdatenbank. 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 zur Primärdatenbank. Verwenden Sie dies für Websites mit sehr häufigen Schreibvorgängen.

Funktionsweise

  • Anonyme Besucher erhalten first-unconstrained — Lesevorgänge gehen zum nächstgelegenen Replikat für die niedrigste Latenz. Da anonyme Benutzer nie schreiben, benötigen sie keine Konsistenzgarantien.
  • Authentifizierte Benutzer (Redakteure, Autoren) erhalten Bookmark-basierte Sessions. Nach einem Schreibvorgang stellt ein Bookmark-Cookie sicher, dass die nächste Anfrage mindestens diesen Status sieht.
  • Schreibanfragen (POST, PUT, DELETE) starten immer bei der primären Datenbank.
  • Build-Zeit-Abfragen (Astro-Content-Collections) umgehen Sessions vollständig und verwenden direkt die Primärdatenbank.

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 lokale)

Lokale Entwicklung

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

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.minnumberMinimale Pool-Verbindungen (Standard 0)
pool.maxnumberMaximale Pool-Verbindungen (Standard 10)

Connection Pooling

Der Adapter verwendet pg.Pool unter der Haube. 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 führt Migrationen automatisch bei der ersten Anfrage aus, für jeden unterstützten Dialekt (D1, SQLite, libSQL, PostgreSQL). Migrationen sind mit dem emdash-Paket gebündelt und in Ihren Build eingebettet.

Wenn die Datenbank leer ist (keine Collections) und der Setup-Assistent noch nicht abgeschlossen wurde, wendet EmDash beim ersten Start auch eine Seed-Datei an. Der Seed wird aus .emdash/seed.json, dem Pfad in package.json#emdash.seed oder seed/seed.json gelesen — je nachdem, welcher zuerst gefunden wird — und zur Kompilierzeit in den Build eingebunden. Wenn keiner vorhanden ist, wird ein eingebauter Standard-Seed verwendet. Nachfolgende Starts gegen eine bestehende Datenbank lassen deren Inhalt unverändert.

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 })],
});

Die Auswahl kann auch auf einer Umgebungsvariable statt dem Build-Modus basieren:

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