EmDash suporta múltiplos backends de banco de dados. Escolha com base no seu alvo de implantação.
Visão Geral
| Banco de Dados | Melhor Para | Implantação |
|---|---|---|
| D1 | Cloudflare Workers | Edge, distribuído globalmente |
| PostgreSQL | Node.js produção | Qualquer plataforma com Postgres |
| libSQL | Bancos de dados remotos | Edge ou Node.js |
| SQLite | Node.js, desenvolvimento local | Servidor único |
Cloudflare D1
D1 é o banco de dados SQLite serverless da Cloudflare. Use-o ao implantar no Cloudflare Workers.
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
Configuração
| Opção | Tipo | Padrão | Descrição |
|---|---|---|---|
binding | string | — | Nome do binding D1 de wrangler.jsonc |
session | string | "disabled" | Modo de replicação de leitura (veja abaixo) |
bookmarkCookie | string | "__em_d1_bookmark" | Nome do cookie para marcadores de sessão |
Configuração
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" Criar um Banco de Dados D1
wrangler d1 create emdash-db
Réplicas de Leitura
D1 suporta replicação de leitura para reduzir a latência de leitura em sites distribuídos globalmente. Quando habilitada, consultas de leitura são roteadas para réplicas próximas em vez de sempre acessar o banco de dados primário.
EmDash usa a API D1 Sessions para gerenciar isso de forma transparente. Ative-a com a opção session:
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
Modos de Sessão
| Modo | Comportamento |
|---|---|
"disabled" | Sem sessões. Todas as consultas vão para o primário. Padrão. |
"auto" | Solicitações anônimas leem da réplica mais próxima. Usuários autenticados obtêm consistência read-your-writes através de cookies de marcadores. |
"primary-first" | Como "auto", mas a primeira consulta sempre vai para o primário. Use para sites com escritas muito frequentes. |
Como Funciona
- Visitantes anônimos obtêm
first-unconstrained— leituras vão para a réplica mais próxima para a menor latência. Como usuários anônimos nunca escrevem, eles não precisam de garantias de consistência. - Usuários autenticados (editores, autores) obtêm sessões baseadas em marcadores. Após uma escrita, um cookie de marcador garante que a próxima solicitação veja pelo menos esse estado.
- Solicitações de escrita (
POST,PUT,DELETE) sempre começam no banco de dados primário. - Consultas em tempo de compilação (coleções de conteúdo Astro) ignoram completamente as sessões e usam o primário diretamente.
libSQL
libSQL é um fork do SQLite que suporta conexões remotas. Use-o quando você precisa de um banco de dados remoto sem 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,
}),
}),
],
});
Configuração
| Opção | Tipo | Descrição |
|---|---|---|
url | string | URL do banco de dados (libsql://... ou file:...) |
authToken | string | Token de autenticação para bancos de dados remotos (opcional para local) |
Desenvolvimento Local
Use um arquivo libSQL local durante o desenvolvimento:
database: libsql({ url: "file:./data.db" });
PostgreSQL
PostgreSQL é suportado para implantações Node.js que precisam de um banco de dados relacional completo.
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});
Configuração
Você pode conectar com uma string de conexão ou parâmetros individuais:
// String de conexão
database: postgres({
connectionString: "postgres://user:password@localhost:5432/emdash",
});
// Parâmetros individuais
database: postgres({
host: "localhost",
port: 5432,
database: "emdash",
user: "emdash",
password: process.env.DB_PASSWORD,
ssl: true,
});
| Opção | Tipo | Descrição |
|---|---|---|
connectionString | string | URL de conexão PostgreSQL |
host | string | Host do banco de dados |
port | number | Porta do banco de dados |
database | string | Nome do banco de dados |
user | string | Usuário do banco de dados |
password | string | Senha do banco de dados |
ssl | boolean | Habilitar SSL |
pool.min | number | Conexões mínimas do pool (padrão 0) |
pool.max | number | Conexões máximas do pool (padrão 10) |
Pooling de Conexões
O adaptador usa pg.Pool internamente. Ajuste o tamanho do pool com base na sua implantação:
database: postgres({
connectionString: process.env.DATABASE_URL,
pool: { min: 2, max: 20 },
});
SQLite
SQLite com better-sqlite3 é a opção mais simples para implantações Node.js.
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
Configuração
| Opção | Tipo | Descrição |
|---|---|---|
url | string | Caminho do arquivo com prefixo file: |
Caminho do Arquivo
A url deve começar com file::
// Caminho relativo
database: sqlite({ url: "file:./data/emdash.db" });
// Caminho absoluto
database: sqlite({ url: "file:/var/data/emdash.db" });
// De variável de ambiente
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });
Migrações
EmDash gerencia migrações automaticamente para SQLite, libSQL e PostgreSQL. Para D1, execute migrações através do Wrangler.
Verificar Status de Migrações
npx emdash init --database ./data.db
Este comando:
- Cria o arquivo do banco de dados se necessário
- Executa migrações pendentes
- Relata o status atual das migrações
Arquivos de Migração
Migrações vêm empacotadas com EmDash. Para executá-las manualmente:
# SQLite/libSQL - migrações executam automaticamente
# D1 - executar através do wrangler
wrangler d1 migrations apply DB
Configuração Baseada em Ambiente
Use bancos de dados diferentes por ambiente:
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 mude com base em variáveis de ambiente:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });