Opzioni Database

In questa pagina

EmDash supporta molteplici backend di database. Scegli in base al tuo target di deployment.

Panoramica

DatabaseIdeale perDeployment
D1Cloudflare WorkersEdge, distribuito globalmente
PostgreSQLNode.js produzioneQualsiasi piattaforma con Postgres
libSQLDatabase remotiEdge o Node.js
SQLiteNode.js, sviluppo localeServer singolo

Cloudflare D1

D1 è il database SQLite serverless di Cloudflare. Usalo quando effettui il deploy su Cloudflare Workers.

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

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

Configurazione

OpzioneTipoPredefinitoDescrizione
bindingstringNome del binding D1 da wrangler.jsonc
sessionstring"disabled"Modalità replica lettura (vedi sotto)
bookmarkCookiestring"__em_d1_bookmark"Nome cookie per bookmark di sessione

Setup

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"

Creare un Database D1

wrangler d1 create emdash-db

Repliche di Lettura

D1 supporta la replicazione in lettura per ridurre la latenza di lettura per siti distribuiti globalmente. Quando abilitata, le query di lettura vengono instradate verso repliche vicine invece di colpire sempre il database primario.

EmDash usa l’API D1 Sessions per gestire questo in modo trasparente. Abilitala con l’opzione session

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

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

Modalità Sessione

ModalitàComportamento
"disabled"Nessuna sessione. Tutte le query vanno al primario. Predefinito.
"auto"Le richieste anonime leggono dalla replica più vicina. Gli utenti autenticati ottengono coerenza read-your-writes tramite cookie bookmark.
"primary-first"Come "auto", ma la prima query va sempre al primario. Usa per siti con scritture molto frequenti.

Come Funziona

  • I visitatori anonimi ottengono first-unconstrained — le letture vanno alla replica più vicina per la latenza più bassa. Poiché gli utenti anonimi non scrivono mai, non necessitano di garanzie di coerenza.
  • Gli utenti autenticati (editor, autori) ottengono sessioni basate su bookmark. Dopo una scrittura, un cookie bookmark assicura che la richiesta successiva veda almeno quello stato.
  • Le richieste di scrittura (POST, PUT, DELETE) iniziano sempre dal database primario.
  • Le query in fase di build (collezioni contenuto Astro) bypassano completamente le sessioni e usano direttamente il primario.

libSQL

libSQL è un fork di SQLite che supporta connessioni remote. Usalo quando hai bisogno di un database remoto senza 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,
			}),
		}),
	],
});

Configurazione

OpzioneTipoDescrizione
urlstringURL database (libsql://... o file:...)
authTokenstringToken autenticazione per database remoti (opzionale per locale)

Sviluppo Locale

Usa un file libSQL locale durante lo sviluppo:

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

PostgreSQL

PostgreSQL è supportato per deployment Node.js che necessitano di un database relazionale completo.

import { postgres } from "emdash/db";

export default defineConfig({
	integrations: [
		emdash({
			database: postgres({
				connectionString: process.env.DATABASE_URL,
			}),
		}),
	],
});

Configurazione

Puoi connetterti con una stringa di connessione o parametri individuali:

// Stringa di connessione
database: postgres({
	connectionString: "postgres://user:password@localhost:5432/emdash",
});

// Parametri individuali
database: postgres({
	host: "localhost",
	port: 5432,
	database: "emdash",
	user: "emdash",
	password: process.env.DB_PASSWORD,
	ssl: true,
});
OpzioneTipoDescrizione
connectionStringstringURL connessione PostgreSQL
hoststringHost database
portnumberPorta database
databasestringNome database
userstringUtente database
passwordstringPassword database
sslbooleanAbilita SSL
pool.minnumberConnessioni pool minime (predefinito 0)
pool.maxnumberConnessioni pool massime (predefinito 10)

Connection Pooling

L’adapter usa pg.Pool internamente. Regola la dimensione del pool in base al tuo deployment:

database: postgres({
	connectionString: process.env.DATABASE_URL,
	pool: { min: 2, max: 20 },
});

SQLite

SQLite con better-sqlite3 è l’opzione più semplice per deployment Node.js.

import { sqlite } from "emdash/db";

export default defineConfig({
	integrations: [
		emdash({
			database: sqlite({ url: "file:./data.db" }),
		}),
	],
});

Configurazione

OpzioneTipoDescrizione
urlstringPercorso file con prefisso file:

Percorso File

L’url deve iniziare con file:

// Percorso relativo
database: sqlite({ url: "file:./data/emdash.db" });

// Percorso assoluto
database: sqlite({ url: "file:/var/data/emdash.db" });

// Da variabile d'ambiente
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });

Migrazioni

EmDash gestisce automaticamente le migrazioni per SQLite, libSQL e PostgreSQL. Per D1, esegui le migrazioni tramite Wrangler.

Controlla Stato Migrazioni

npx emdash init --database ./data.db

Questo comando:

  1. Crea il file database se necessario
  2. Esegue migrazioni pendenti
  3. Riporta lo stato corrente delle migrazioni

File di Migrazione

Le migrazioni sono incluse con EmDash. Per eseguirle manualmente:

# SQLite/libSQL - le migrazioni vengono eseguite automaticamente

# D1 - esegui tramite wrangler
wrangler d1 migrations apply DB

Configurazione Basata su Ambiente

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

O cambia in base alle variabili d’ambiente:

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