コンテンツにスキップ

データベースオプション

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

データベース最適な用途デプロイ先
D1Cloudflare Workersエッジ、グローバル分散型
PostgreSQL本番環境用Node.jsPostgreSQLが利用可能な任意のプラットフォーム
libSQLリモートデータベースエッジまたはNode.js
SQLiteNode.js、ローカル開発単一サーバー

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

astro.config.mjs
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({ binding: "DB" }),
}),
],
});
オプションタイプデフォルト説明
bindingstring—wrangler.jsoncからのD1バインディング名
sessionstring"disabled"読み取りレプリケーションモード(下記参照)
bookmarkCookiestring"__ec_d1_bookmark"セッションブックマーク用のクッキー名
{
"d1_databases": [
{
"binding": "DB",
"database_name": "emdash-db",
"database_id": "your-database-id"
}
]
}
Terminal window
wrangler d1 create emdash-db

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

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

js title="astro.config.mjs"
import { d1 } from "@emdash-cms/cloudflare";
export default defineConfig({
integrations: [
emdash({
database: d1({
binding: "DB",
session: "auto",
}),
}),
],
});
モード動作
"disabled"セッションなし。すべてのクエリはプライマリに送られます。デフォルト。
"auto"匿名リクエストは最も近いレプリカから読み取ります。認証済みユーザーはブックマーククッキーを介してread-your-writes整合性を取得します。
"primary-first""auto"と同様ですが、最初のクエリは常にプライマリに送られます。書き込み頻度の非常に高いサイトに使用します。
  • 匿名訪問者にはfirst-unconstrainedが適用され、読み取りは最も近いレプリカに送られて最低遅延を実現します。匿名ユーザーは書き込みを行わないため、整合性保証は必要ありません。
  • 認証済みユーザー(編集者、著者)にはブックマークベースのセッションが適用されます。書き込み後、ブックマーククッキーにより次のリクエストで少なくともその状態が反映されます。
  • 書き込みリクエスト(POST、PUT、DELETE)は常にプライマリデータベースから開始されます。
  • ビルド時クエリ(Astroコンテンツコレクション)はセッションを完全にバイパスし、プライマリを直接使用します。

libSQLはリモート接続をサポートするSQLiteのフォークです。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,
}),
}),
],
});
オプションタイプ説明
urlstringデータベースURL(libsql://... または file:...)
authTokenstringリモートデータベース用の認証トークン(ローカルではオプション)

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

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

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

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

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

// Connection string
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 },
});

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

js title="astro.config.mjs"
import { sqlite } from "emdash/db";
export default defineConfig({
integrations: [
emdash({
database: sqlite({ url: "file:./data.db" }),
}),
],
});
オプションタイプ説明
urlstringfile:プレフィックス付きのファイルパス

urlはfile:で始める必要があります:

// Relative path
database: sqlite({ url: "file:./data/emdash.db" });
// 絶対パス
database: sqlite({ url: "file:/var/data/emdash.db" });
// 環境変数から
database: sqlite({ url: `file:${process.env.DATABASE_PATH}` });

EmDashはSQLite、libSQL、PostgreSQLのマイグレーションを自動的に処理します。D1の場合、Wrangler経由でマイグレーションを実行してください。

マイグレーションの状態を確認

Section titled “マイグレーションの状態を確認”
Terminal window
npx emdash init --database ./data.db

このコマンドは:

  1. 必要に応じてデータベースファイルを作成します
  2. 保留中のマイグレーションを実行します
  3. 現在のマイグレーション状態を報告します

マイグレーションはEmDashにバンドルされています。手動で実行するには:

Terminal window
# SQLite/libSQL - migrations run automatically
# D1 - wrangler経由で実行
wrangler d1 migrations apply DB

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

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

または、環境変数に基づいて切り替え:

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