Opciones de Base de Datos

En esta página

EmDash admite múltiples backends de base de datos. Elija según su objetivo de implementación.

Resumen

Base de DatosMejor ParaImplementación
D1Cloudflare WorkersEdge, distribuido globalmente
PostgreSQLNode.js en producciónCualquier plataforma con Postgres
libSQLBases de datos remotasEdge o Node.js
SQLiteNode.js, desarrollo localServidor ú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ónTipoPredeterminadoDescripción
bindingstringNombre de binding D1 de wrangler.jsonc
sessionstring"disabled"Modo de replicación de lectura (ver abajo)
bookmarkCookiestring"__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

ModoComportamiento
"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ónTipoDescripción
urlstringURL de base de datos (libsql://... o file:...)
authTokenstringToken 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ónTipoDescripción
connectionStringstringURL de conexión PostgreSQL
hoststringHost de base de datos
portnumberPuerto de base de datos
databasestringNombre de base de datos
userstringUsuario de base de datos
passwordstringContraseña de base de datos
sslbooleanHabilitar SSL
pool.minnumberConexiones mínimas del pool (predeterminado 0)
pool.maxnumberConexiones 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ónTipoDescripción
urlstringRuta 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" });