EmDash suporta múltiplos backends de banco de dados. Escolha com base no seu objetivo de implantação.
Visão Geral
| Banco de Dados | Melhor Para | Implantação |
|---|---|---|
| D1 | Cloudflare Workers | Edge, distribuído globalmente |
| PostgreSQL | Node.js em 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 Inicial
wrangler.jsonc
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db"
}
]
} wrangler.toml
[[d1_databases]]
binding = "DB"
database_name = "emdash-db" Réplicas de Leitura
D1 suporta replicação de leitura para reduzir a latência de leitura para sites distribuídos globalmente. Quando habilitado, 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. Habilite-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 via cookies de marcador. |
"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 recebem
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) recebem 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 precisar 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 executa migrações automaticamente na primeira solicitação, para cada dialeto suportado (D1, SQLite, libSQL, PostgreSQL). As migrações são empacotadas com o pacote emdash e incorporadas na sua compilação.
Se o banco de dados estiver vazio (sem coleções) e o assistente de configuração não tiver sido concluído, EmDash também aplica um arquivo de seed na primeira inicialização. O seed é lido de .emdash/seed.json, o caminho em package.json#emdash.seed, ou seed/seed.json — o que for encontrado primeiro — e incorporado na compilação em tempo de compilação. Se nenhum estiver presente, um seed padrão incorporado é usado. Inicializações subsequentes contra um banco de dados existente deixam seu conteúdo intacto.
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 })],
});
A escolha também pode ser baseada em uma variável de ambiente em vez do modo de compilação:
const database = process.env.DATABASE_URL
? postgres({ connectionString: process.env.DATABASE_URL })
: sqlite({ url: "file:./data.db" });