データベースオプション

このページ

EmDashは複数のデータベースバックエンドをサポートしています。デプロイターゲットに基づいて選択してください。

概要

データベース最適な用途デプロイメント
D1Cloudflare WorkersEdge、グローバル分散
PostgreSQL本番環境のNode.jsPostgresを使用できる任意のプラットフォーム
libSQLリモートデータベースEdgeまたはNode.js
SQLiteNode.js、ローカル開発単一サーバー

Cloudflare D1

D1はCloudflareのサーバーレスSQLiteデータベースです。Cloudflare Workersにデプロイする際に使用します。

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

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

設定

オプションデフォルト説明
bindingstringwrangler.jsoncからのD1バインディング名
sessionstring"disabled"読み取りレプリケーションモード(以下を参照)
bookmarkCookiestring"__em_d1_bookmark"セッションブックマーク用のCookie名

セットアップ

wrangler.jsonc

{
  "d1_databases": [
    {
      "binding": "DB",
      "database_name": "emdash-db"
    }
  ]
}

wrangler.toml

[[d1_databases]]
binding = "DB"
database_name = "emdash-db"

読み取りレプリカ

D1は読み取りレプリケーションをサポートしており、グローバル分散サイトの読み取りレイテンシを低減します。有効にすると、読み取りクエリは常にプライマリデータベースにアクセスする代わりに、近くのレプリカにルーティングされます。

EmDashはD1 Sessions APIを使用して、これを透過的に管理します。sessionオプションで有効にします:

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

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

セッションモード

モード動作
"disabled"セッションなし。すべてのクエリがプライマリに送信されます。デフォルト。
"auto"匿名リクエストは最も近いレプリカから読み取ります。認証されたユーザーは、ブックマークCookieを介してread-your-writes整合性を取得します。
"primary-first""auto"と同様ですが、最初のクエリは常にプライマリに送信されます。非常に頻繁な書き込みがあるサイトで使用します。

仕組み

  • 匿名訪問者first-unconstrainedを取得します — 読み取りは最も低いレイテンシのために最も近いレプリカに送信されます。匿名ユーザーは書き込みを行わないため、整合性の保証は必要ありません。
  • 認証されたユーザー(編集者、著者)は、ブックマークベースのセッションを取得します。書き込み後、ブックマークCookieは次のリクエストが少なくともその状態を見ることを保証します。
  • 書き込みリクエストPOSTPUTDELETE)は常にプライマリデータベースから開始されます。
  • ビルド時クエリ(Astroコンテンツコレクション)は、セッションを完全にバイパスし、プライマリを直接使用します。

libSQL

libSQLは、リモート接続をサポートするSQLiteのフォークです。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,
			}),
		}),
	],
});

設定

オプション説明
urlstringデータベースURL(libsql://...またはfile:...
authTokenstringリモートデータベース用の認証トークン(ローカルの場合は任意)

ローカル開発

開発中はローカルlibSQLファイルを使用します:

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

PostgreSQL

PostgreSQLは、完全なリレーショナルデータベースが必要なNode.jsデプロイメントでサポートされています。

import { postgres } from "emdash/db";

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

設定

接続文字列または個別のパラメータで接続できます:

// 接続文字列
database: postgres({
	connectionString: "postgres://user:password@localhost:5432/emdash",
});

// 個別のパラメータ
database: postgres({
	host: "localhost",
	port: 5432,
	database: "emdash",
	user: "emdash",
	password: process.env.DB_PASSWORD,
	ssl: true,
});
オプション説明
connectionStringstringPostgreSQL接続URL
hoststringデータベースホスト
portnumberデータベースポート
databasestringデータベース名
userstringデータベースユーザー
passwordstringデータベースパスワード
sslbooleanSSLを有効にする
pool.minnumber最小プール接続数(デフォルト0)
pool.maxnumber最大プール接続数(デフォルト10)

コネクションプーリング

アダプターは内部でpg.Poolを使用します。デプロイメントに基づいてプールサイズを調整します:

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

SQLite

better-sqlite3を使用したSQLiteは、Node.jsデプロイメントの最もシンプルなオプションです。

import { sqlite } from "emdash/db";

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

設定

オプション説明
urlstringfile:プレフィックス付きファイルパス

ファイルパス

urlfile:で始まる必要があります:

// 相対パス
database: sqlite({ url: "file:./data/emdash.db" });

// 絶対パス
database: sqlite({ url: "file:/var/data/emdash.db" });

// 環境変数から
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });

マイグレーション

EmDashは、サポートされているすべてのダイアレクト(D1、SQLite、libSQL、PostgreSQL)について、最初のリクエスト時にマイグレーションを自動的に実行します。マイグレーションはemdashパッケージにバンドルされ、ビルドに埋め込まれます。

データベースが空(コレクションなし)で、セットアップウィザードが完了していない場合、EmDashは最初の起動時にシードファイルも適用します。シードは.emdash/seed.jsonpackage.json#emdash.seedのパス、またはseed/seed.jsonから読み取られます — 最初に見つかったものが使用されます — そしてコンパイル時にビルドにインライン化されます。いずれも存在しない場合は、組み込みのデフォルトシードが使用されます。既存のデータベースに対する後続の起動では、そのコンテンツはそのまま保持されます。

環境ベースの設定

環境ごとに異なるデータベースを使用します:

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 })],
});

ビルドモードの代わりに環境変数に基づいて選択することもできます:

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