Opções de Banco de Dados

Nesta página

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

Visão Geral

Banco de DadosMelhor ParaImplantação
D1Cloudflare WorkersEdge, distribuído globalmente
PostgreSQLNode.js produçãoQualquer plataforma com Postgres
libSQLBancos de dados remotosEdge ou Node.js
SQLiteNode.js, desenvolvimento localServidor ú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çãoTipoPadrãoDescrição
bindingstringNome do binding D1 de wrangler.jsonc
sessionstring"disabled"Modo de replicação de leitura (veja abaixo)
bookmarkCookiestring"__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

ModoComportamento
"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çãoTipoDescrição
urlstringURL do banco de dados (libsql://... ou file:...)
authTokenstringToken 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çã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 do pool (padrão 0)
pool.maxnumberConexõ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çãoTipoDescrição
urlstringCaminho 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:

  1. Cria o arquivo do banco de dados se necessário
  2. Executa migrações pendentes
  3. 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" });