EmDash admite múltiples backends de base de datos. Elija según su objetivo de implementación.
Resumen
| Base de Datos | Mejor Para | Implementación |
|---|---|---|
| D1 | Cloudflare Workers | Edge, distribuido globalmente |
| PostgreSQL | Node.js en producción | Cualquier plataforma con Postgres |
| libSQL | Bases de datos remotas | Edge o Node.js |
| SQLite | Node.js, desarrollo local | Servidor único |
Cloudflare D1
D1 es la base de datos SQLite serverless de Cloudflare. Úsela al implementar en Cloudflare Workers.
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
Configuración
| Opción | Tipo | Predeterminado | Descripción |
|---|---|---|---|
binding | string | — | Nombre de binding D1 de wrangler.jsonc |
session | string | "disabled" | Modo de replicación de lectura (ver abajo) |
bookmarkCookie | string | "__em_d1_bookmark" | Nombre de cookie para marcadores de sesión |
Configuración Inicial
wrangler.jsonc
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db"
}
]
} wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "emdash-db" Réplicas de Lectura
D1 admite replicación de lectura para reducir la latencia de lectura en sitios distribuidos globalmente. Cuando está habilitado, las consultas de lectura se enrutan a réplicas cercanas en lugar de siempre acceder a la base de datos principal.
EmDash usa la API de Sesiones D1 para gestionar esto de forma transparente. Actívela con la opción session:
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
Modos de Sesión
| Modo | Comportamiento |
|---|---|
"disabled" | Sin sesiones. Todas las consultas van a la principal. Predeterminado. |
"auto" | Las solicitudes anónimas leen de la réplica más cercana. Los usuarios autenticados obtienen consistencia de lectura-después-de-escritura mediante cookies de marcador. |
"primary-first" | Como "auto", pero la primera consulta siempre va a la principal. Use para sitios con escrituras muy frecuentes. |
Cómo Funciona
- Visitantes anónimos obtienen
first-unconstrained— las lecturas van a la réplica más cercana para la latencia más baja. Dado que los usuarios anónimos nunca escriben, no necesitan garantías de consistencia. - Usuarios autenticados (editores, autores) obtienen sesiones basadas en marcadores. Después de una escritura, una cookie de marcador asegura que la siguiente solicitud vea al menos ese estado.
- Solicitudes de escritura (
POST,PUT,DELETE) siempre comienzan en la base de datos principal. - Consultas en tiempo de compilación (colecciones de contenido Astro) omiten las sesiones por completo y usan la principal directamente.
libSQL
libSQL es un fork de SQLite que admite conexiones remotas. Úselo cuando necesite una base de datos remota sin Cloudflare D1.
import { libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
}),
}),
],
});
Configuración
| Opción | Tipo | Descripción |
|---|---|---|
url | string | URL de base de datos (libsql://... o file:...) |
authToken | string | Token de autenticación para bases de datos remotas (opcional para local) |
Desarrollo Local
Use un archivo libSQL local durante el desarrollo:
database: libsql({ url: "file:./data.db" });
PostgreSQL
PostgreSQL es compatible con implementaciones de Node.js que necesitan una base de datos relacional completa.
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
Configuración
Puede conectarse con una cadena de conexión o parámetros individuales:
// Cadena de conexión
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Parámetros individuales
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| Opción | Tipo | Descripción |
|---|---|---|
connectionString | string | URL de conexión PostgreSQL |
host | string | Host de base de datos |
port | number | Puerto de base de datos |
database | string | Nombre de base de datos |
user | string | Usuario de base de datos |
password | string | Contraseña de base de datos |
ssl | boolean | Habilitar SSL |
pool.min | number | Conexiones mínimas del pool (predeterminado 0) |
pool.max | number | Conexiones máximas del pool (predeterminado 10) |
Agrupación de Conexiones
El adaptador usa pg.Pool internamente. Ajuste el tamaño del pool según su implementación:
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
SQLite con better-sqlite3 es la opción más simple para implementaciones de Node.js.
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
Configuración
| Opción | Tipo | Descripción |
|---|---|---|
url | string | Ruta de archivo con prefijo file: |
Ruta de Archivo
La url debe comenzar con file::
// Ruta relativa
database: sqlite({ url: "file:./data/emdash.db" });
// Ruta absoluta
database: sqlite({ url: "file:/var/data/emdash.db" });
// Desde variable de entorno
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
Migraciones
EmDash ejecuta migraciones automáticamente en la primera solicitud, para cada dialecto compatible (D1, SQLite, libSQL, PostgreSQL). Las migraciones están empaquetadas con el paquete emdash e integradas en su compilación.
Si la base de datos está vacía (sin colecciones) y el asistente de configuración no se ha completado, EmDash también aplica un archivo de semilla en el primer arranque. La semilla se lee de .emdash/seed.json, la ruta en package.json#emdash.seed, o seed/seed.json — el que se encuentre primero — y se incorpora en la compilación en tiempo de compilación. Si no hay ninguno presente, se usa una semilla predeterminada incorporada. Los arranques posteriores contra una base de datos existente dejan su contenido intacto.
Configuración Basada en Entorno
Use diferentes bases de datos por entorno:
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 })],
});
La elección también puede basarse en una variable de entorno en lugar del modo de compilación:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });