Aller au contenu

Options de Base de Données

EmDash prend en charge plusieurs moteurs de base de données. Choisissez en fonction de votre cible de déploiement.

Base de donnéesIdéale pourDéploiement
D1Cloudflare WorkersEdge, distribué globalement
PostgreSQLProduction Node.jsToute plateforme avec Postgres
libSQLBases de données distantesEdge ou Node.js
SQLiteNode.js, développement localServeur unique

D1 est la base de données SQLite serverless de Cloudflare. Utilisez-la lors du déploiement sur Cloudflare Workers.

astro.config.mjs
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
OptionTypePar défautDescription
bindingstring—Nom du binding D1 depuis wrangler.jsonc
sessionstring"disabled"Mode de réplication en lecture (voir ci-dessous)
bookmarkCookiestring"__ec_d1_bookmark"Nom du cookie pour les marque-pages de session
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db",
"database_id": "your-database-id"
}
]
}
Fenêtre de terminal
wrangler d1 create emdash-db

D1 prend en charge la réplication en lecture pour réduire la latence de lecture pour les sites distribués globalement. Lorsqu’elle est activée, les requêtes de lecture sont acheminées vers les réplicas les plus proches au lieu de toujours interroger la base de données primaire.

EmDash utilise l’API D1 Sessions pour gérer cela de manière transparente. Activez-la avec l’option session :

js title="astro.config.mjs"
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
ModeComportement
"disabled"Pas de sessions. Toutes les requêtes vont vers le primaire. Par défaut.
"auto"Les requêtes anonymes lisent depuis le réplica le plus proche. Les utilisateurs authentifiés bénéficient de la cohérence “read-your-writes” via des cookies de marque-pages.
"primary-first"Comme "auto", mais la première requête va toujours vers le primaire. À utiliser pour les sites avec des écritures très fréquentes.
  • Les visiteurs anonymes obtiennent first-unconstrained — les lectures vont vers le réplica le plus proche pour la latence la plus faible. Comme les utilisateurs anonymes n’écrivent jamais, ils n’ont pas besoin de garanties de cohérence.
  • Les utilisateurs authentifiés (éditeurs, auteurs) obtiennent des sessions basées sur des marque-pages. Après une écriture, un cookie de marque-page garantit que la prochaine requête voit au moins cet état.
  • Les requêtes d’écriture (POST, PUT, DELETE) commencent toujours à la base de données primaire.
  • Les requêtes au moment de la construction (collections de contenu Astro) contournent entièrement les sessions et utilisent directement le primaire.

libSQL est un fork de SQLite qui prend en charge les connexions distantes. Utilisez-le lorsque vous avez besoin d’une base de données distante sans Cloudflare D1.

js title="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,
}),
}),
],
});
OptionTypeDescription
urlstringURL de la base de données (libsql://... ou file:...)
authTokenstringJeton d’authentification pour les bases de données distantes (optionnel pour local)

Utilisez un fichier libSQL local pendant le développement :

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

PostgreSQL est pris en charge pour les déploiements Node.js nécessitant une base de données relationnelle complète.

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

Vous pouvez vous connecter avec une chaîne de connexion ou des paramètres individuels :

// Connection string
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Paramètres individuels
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
OptionTypeDescription
connectionStringstringURL de connexion PostgreSQL
hoststringHôte de la base de données
portnumberPort de la base de données
databasestringNom de la base de données
userstringUtilisateur de la base de données
passwordstringMot de passe de la base de données
sslbooleanActiver SSL
pool.minnumberConnexions minimales du pool (par défaut 0)
pool.maxnumberConnexions maximales du pool (par défaut 10)

L’adaptateur utilise pg.Pool en interne. Ajustez la taille du pool en fonction de votre déploiement :

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

SQLite avec better-sqlite3 est l’option la plus simple pour les déploiements Node.js.

js title="astro.config.mjs"
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
OptionTypeDescription
urlstringChemin du fichier avec le préfixe file:

L’url doit commencer par file: :

// Relative path
database: sqlite({ url: "file:./data/emdash.db" });
// Chemin absolu
database: sqlite({ url: "file:/var/data/emdash.db" });
// À partir d'une variable d'environnement
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });

EmDash gère automatiquement les migrations pour SQLite, libSQL et PostgreSQL. Pour D1, exécutez les migrations via Wrangler.

Fenêtre de terminal
npx emdash init --database ./data.db

Cette commande :

  1. Crée le fichier de base de données si nécessaire
  2. Exécute toutes les migrations en attente
  3. Rapporte l’état actuel des migrations

Les migrations sont incluses avec EmDash. Pour les exécuter manuellement :

Fenêtre de terminal
# SQLite/libSQL - migrations run automatically
# D1 - exécuter via wrangler
wrangler d1 migrations apply DB

Utilisez différentes bases de données par environnement :

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

Ou basculez en fonction des variables d’environnement :

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