Pular para o conteúdo

Opções de Banco de Dados

O EmDash suporta múltiplos backends de banco de dados. Escolha com base no seu alvo de implantação.

Banco de DadosMelhor ParaImplantação
D1Cloudflare WorkersEdge, distribuído globalmente
PostgreSQLNode.js em ProduçãoQualquer plataforma com Postgres
libSQLBancos de dados remotosEdge ou Node.js
SQLiteNode.js, desenvolvimento localServidor único

D1 é o banco de dados SQLite serverless da Cloudflare. Use-o ao implantar no Cloudflare Workers.

astro.config.mjs
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
OpçãoTipoPadrãoDescrição
bindingstring—Nome do binding D1 do wrangler.jsonc
sessionstring"disabled"Modo de replicação de leitura (veja abaixo)
bookmarkCookiestring"__ec_d1_bookmark"Nome do cookie para marcadores de sessão
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db",
"database_id": "your-database-id"
}
]
}
Terminal window
wrangler d1 create emdash-db

O 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 direcionadas para réplicas próximas em vez de sempre acessarem o banco de dados primário.

O EmDash usa a API de Sessões do D1 para gerenciar isso de forma transparente. Habilite-a com a opção session:

js title="astro.config.mjs"
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
ModoComportamento
"disabled"Sem sessões. Todas as consultas vão para o primário. Padrão.
"auto"Requisições anônimas leem da réplica mais próxima. Usuários autenticados obtêm consistência de leitura-após-escrita 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.
  • Visitantes anônimos recebem first-unconstrained — as 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 marcador. Após uma escrita, um cookie de marcador garante que a próxima requisição veja pelo menos aquele estado.
  • Requisições de escrita (POST, PUT, DELETE) sempre começam no banco de dados primário.
  • Consultas em tempo de build (coleções de conteúdo do Astro) ignoram as sessões completamente e usam o primário diretamente.

libSQL é um fork do SQLite que suporta conexões remotas. Use-o quando precisar de um banco de dados remoto sem o Cloudflare D1.

js title="astro.config.mjs"
import { libsql } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: libsql({
url: process.env.LIBSQL_DATABASE_URL,
authToken: process.env.LIBSQL_AUTH_TOKEN,
}),
}),
],
});
OpçãoTipoDescrição
urlstringURL do banco de dados (libsql://... ou file:...)
authTokenstringToken de autenticação para bancos de dados remotos (opcional para local)

Use um arquivo libSQL local durante o desenvolvimento:

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

PostgreSQL é suportado para implantações Node.js que precisam de um banco de dados relacional completo.

js title="astro.config.mjs"
import { postgres } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: postgres({
connectionString: process.env.DATABASE_URL,
}),
}),
],
});

Você pode conectar com uma string de conexão ou parâmetros individuais:

// Connection string
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çãoTipoDescrição
connectionStringstringURL de conexão PostgreSQL
hoststringHost do banco de dados
portnumberPorta do banco de dados
databasestringNome do banco de dados
userstringUsuário do banco de dados
passwordstringSenha do banco de dados
sslbooleanHabilitar SSL
pool.minnumberConexões mínimas no pool (padrão 0)
pool.maxnumberConexões máximas no pool (padrão 10)

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 com better-sqlite3 é a opção mais simples para implantações Node.js.

js title="astro.config.mjs"
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
OpçãoTipoDescrição
urlstringCaminho do arquivo com prefixo file:

O url deve começar com file::

// Relative path
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}` });

O EmDash gerencia migrações automaticamente para SQLite, libSQL e PostgreSQL. Para D1, execute migrações via Wrangler.

Terminal window
npx emdash init --database ./data.db

Este comando:

  1. Cria o arquivo do banco de dados, se necessário
  2. Executa quaisquer migrações pendentes
  3. Relata o status atual da migração

As migrações são incluídas com o EmDash. Para executá-las manualmente:

Terminal window
# SQLite/libSQL - migrations run automatically
# D1 - execute via wrangler
wrangler d1 migrations apply DB

Use bancos de dados diferentes por ambiente:

js title="astro.config.mjs"
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 alterne com base em variáveis de ambiente:

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