Opciones de Base de Datos

En esta página

EmDash admite múltiples backends de base de datos. Elige según tu objetivo de despliegue.

Descripción General

Base de DatosMejor ParaDespliegue
D1Cloudflare WorkersEdge, distribuido globalmente
PostgreSQLNode.js 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. Úsala al desplegar en Cloudflare Workers.

import { d1 } from "@emdash-cms/cloudflare";

export default defineConfig({
	integrations: [
		emdash({
			database: d1({ binding: "DB" }),
		}),
	],
});

Configuración

OpciónTipoPor DefectoDescripción
bindingstringNombre del binding D1 desde 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

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"

Crear una Base de Datos D1

wrangler d1 create emdash-db

Réplicas de Lectura

D1 admite replicación de lectura para reducir la latencia de lectura en sitios distribuidos globalmente. Cuando está habilitada, las consultas de lectura se enrutan a réplicas cercanas en lugar de alcanzar siempre la base de datos primaria.

EmDash utiliza la API D1 Sessions para gestionar esto de forma transparente. Actívala 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 al primario. Por defecto.
"auto"Las solicitudes anónimas leen desde la réplica más cercana. Los usuarios autenticados obtienen consistencia read-your-writes a través de cookies de marcadores.
"primary-first"Como "auto", pero la primera consulta siempre va al primario. Úsalo para sitios con escrituras muy frecuentes.

Cómo Funciona

  • Los visitantes anónimos obtienen first-unconstrained — las lecturas van a la réplica más cercana para la latencia más baja. Como los usuarios anónimos nunca escriben, no necesitan garantías de consistencia.
  • Los 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.
  • Las solicitudes de escritura (POST, PUT, DELETE) siempre comienzan en la base de datos primaria.
  • Las consultas en tiempo de compilación (colecciones de contenido Astro) omiten completamente las sesiones y usan el primario directamente.

libSQL

libSQL es un fork de SQLite que admite conexiones remotas. Úsalo cuando necesites 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 la base de datos (libsql://... o file:...)
authTokenstringToken de autenticación para bases de datos remotas (opcional para local)

Desarrollo Local

Usa un archivo libSQL local durante el desarrollo:

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

PostgreSQL

PostgreSQL es compatible con despliegues 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

Puedes conectarte 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 la base de datos
portnumberPuerto de la base de datos
databasestringNombre de la base de datos
userstringUsuario de la base de datos
passwordstringContraseña de la base de datos
sslbooleanHabilitar SSL
pool.minnumberConexiones de pool mínimas (por defecto 0)
pool.maxnumberConexiones de pool máximas (por defecto 10)

Agrupación de Conexiones

El adaptador usa pg.Pool internamente. Ajusta el tamaño del pool según tu despliegue:

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 despliegues 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 maneja automáticamente las migraciones para SQLite, libSQL y PostgreSQL. Para D1, ejecuta las migraciones a través de Wrangler.

Verificar Estado de Migraciones

npx emdash init --database ./data.db

Este comando:

  1. Crea el archivo de base de datos si es necesario
  2. Ejecuta las migraciones pendientes
  3. Informa del estado actual de las migraciones

Archivos de Migración

Las migraciones vienen incluidas con EmDash. Para ejecutarlas manualmente:

# SQLite/libSQL - las migraciones se ejecutan automáticamente

# D1 - ejecutar a través de wrangler
wrangler d1 migrations apply DB

Configuración Basada en Entorno

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

O cambia según las variables de entorno:

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