始める
このガイドでは、以下のことを説明します:
- D1を使用して最初のデータベースを作成する方法。D1はCloudflareのネイティブなサーバーレスSQLデータベースです。
- スキーマを作成し、コマンドラインを介してデータベースをクエリする方法。
- Cloudflare WorkerをD1データベースに接続して、プログラム的にD1データベースをクエリする方法。
続行するには:
- まだアカウントを作成していない場合は、Cloudflareアカウント ↗にサインアップしてください。
npm↗をインストールします。Node.js↗をインストールします。権限の問題を避け、Node.jsのバージョンを変更するために、Volta ↗やnvm ↗のようなNodeバージョンマネージャーを使用してください。Wranglerは、16.17.0以上のNodeバージョンを必要とします。
データベースをクエリする手段として新しいWorkerを作成します。
-
次のコマンドを実行して、
d1-tutorialという名前の新しいプロジェクトを作成します:Terminal window npm create cloudflare@latest -- d1-tutorialTerminal window yarn create cloudflare@latest d1-tutorialTerminal window pnpm create cloudflare@latest d1-tutorialFor setup, select the following options:
- For What would you like to start with?, choose
Hello Worldの例. - For Which template would you like to use?, choose
Hello World Worker. - For Which language do you want to use?, choose
TypeScript. - For Do you want to use git for version control?, choose
Yes. - For Do you want to deploy your application?, choose
No(we will be making some changes before deploying).
これにより、以下のように新しい
d1-tutorialディレクトリが作成されます。ディレクトリd1-tutorial
ディレクトリnode_modules/
- …
ディレクトリtest/
- …
ディレクトリsrc
- index.ts
- package-lock.json
- package.json
- testconfig.json
- vitest.config.mts
- worker-configuration.d.ts
- wrangler.toml
新しい
d1-tutorialディレクトリには以下が含まれています:index.tsにある「Hello World」Worker。- D1データベースにアクセスするための
wrangler.toml設定ファイル。wrangler.tomlは、d1-tutorialWorkerがD1データベースにアクセスする方法です。
- For What would you like to start with?, choose
D1データベースは、他の多くのデータベースと概念的に似ています:データベースは1つ以上のテーブルを含むことができ、これらのテーブルをクエリする機能とオプションのインデックスを持っています。D1は、SQLiteで使用されるSQLクエリ言語 ↗を使用します。
最初のD1データベースを作成するには:
-
Workersプロジェクトのために作成したディレクトリに移動します:
Terminal window cd d1-tutorial -
次の
wrangler d1コマンドを実行し、データベースに名前を付けます。このチュートリアルでは、データベースの名前はprod-d1-tutorialです:Terminal window npx wrangler d1 create prod-d1-tutorial✅ DB 'prod-d1-tutorial'を正常に作成しました[[d1_databases]]binding = "DB" # env.DBでWorker内で利用可能database_name = "prod-d1-tutorial"database_id = "<unique-ID-for-your-database>"
これにより、新しいD1データベースが作成され、次のステップで必要なbinding設定が出力されます。
WorkerがD1データベースに接続するためのバインディングを作成する必要があります。Bindingsを使用すると、Cloudflare開発者プラットフォーム上のD1などのリソースにWorkersがアクセスできます。wrangler.tomlファイルを更新することでバインディングを作成します。
D1データベースをWorkerにバインドするには:
-
ターミナルからステップ2で取得した行をコピーします。
-
それらを
wrangler.tomlファイルの末尾に追加します。[[d1_databases]]binding = "DB" # env.DBでWorker内で利用可能database_name = "prod-d1-tutorial"database_id = "<unique-ID-for-your-database>"具体的には:
bindingに設定する値(文字列)はバインディング名であり、Worker内でこのデータベースを参照するために使用されます。このチュートリアルでは、バインディング名をDBと名付けます。- バインディング名は有効なJavaScript変数名 ↗でなければなりません。例えば、
binding = "MY_DB"やbinding = "productionDB"はどちらもバインディングの有効な名前です。 - バインディングは
env.<BINDING_NAME>でWorker内で利用可能で、D1のクライアントAPIはこのバインディングで公開されます。
D1データベースをPages Functionにバインドすることもできます。詳細については、Functions Bindings for D1を参照してください。
wrangler.tomlが正しく構成されたら、データベースをセットアップします。以下の例のschema.sqlファイルを使用してデータベースを初期化します。
-
次のコードをコピーし、ステップ1で作成した
d1-tutorialWorkerディレクトリにschema.sqlファイルとして保存します:DROP TABLE IF EXISTS Customers;CREATE TABLE IF NOT EXISTS Customers (CustomerId INTEGER PRIMARY KEY, CompanyName TEXT, ContactName TEXT);INSERT INTO Customers (CustomerID, CompanyName, ContactName) VALUES (1, 'Alfreds Futterkiste', 'Maria Anders'), (4, 'Around the Horn', 'Thomas Hardy'), (11, 'Bs Beverages', 'Victoria Ashworth'), (13, 'Bs Beverages', 'Random Name'); -
最初にローカルで実行してテストするためにデータベースを初期化します。次のコマンドを実行して新しいD1データベースをブートストラップします:
Terminal window npx wrangler d1 execute prod-d1-tutorial --local --file=./schema.sql -
次のコマンドを実行して、データがデータベースに存在することを確認します:
Terminal window npx wrangler d1 execute prod-d1-tutorial --local --command="SELECT * FROM Customers"🌀 SQL入力をステートメントの配列にマッピング中🌀 ローカルデータベースproduction-db-backend (5f092302-3fbd-4247-a873-bf1afc5150b)で実行中 .wrangler/state/v3/d1:┌────────────┬─────────────────────┬───────────────────┐│ CustomerId │ CompanyName │ ContactName │├────────────┼─────────────────────┼───────────────────┤│ 1 │ Alfreds Futterkiste │ Maria Anders │├────────────┼─────────────────────┼───────────────────┤│ 4 │ Around the Horn │ Thomas Hardy │├────────────┼─────────────────────┼───────────────────┤│ 11 │ Bs Beverages │ Victoria Ashworth │├────────────┼─────────────────────┼───────────────────┤│ 13 │ Bs Beverages │ Random Name │└────────────┴─────────────────────┴───────────────────┘
データベースをセットアップした後、Worker内からSQLクエリを実行します。
-
d1-tutorialWorkerに移動し、index.tsファイルを開きます。index.tsファイルは、D1とのWorkerの相互作用を構成する場所です。 -
index.tsの内容をクリアします。 -
次のコードスニペットを
index.tsファイルに貼り付けます:export interface Env {// wrangler.tomlで'binding'の値に別の名前を設定した場合は、// "DB"を定義した変数名に置き換えてください。DB: D1Database;}export default {async fetch(request, env): Promise<Response> {const { pathname } = new URL(request.url);if (pathname === "/api/beverages") {// `DB`をバインディング名として使用しなかった場合は、ここで変更してくださいconst { results } = await env.DB.prepare("SELECT * FROM Customers WHERE CompanyName = ?",).bind("Bs Beverages").all();return Response.json(results);}return new Response("Bs Beveragesで働いている全員を見るには/api/beveragesを呼び出してください",);},} satisfies ExportedHandler<Env>;上記のコードでは、以下のことを行います:
- TypeScriptコード内でD1データベースへのバインディングを定義します。このバインディングは、
wrangler.tomlの[[d1_databases]]で設定したbinding値と一致します。 - プレースホルダー(クエリ内の
?)を使用して、env.DB.prepareを使用してデータベースをクエリします。 bind()を呼び出して、そのプレースホルダーに安全かつセキュアに値をバインドします。実際のアプリケーションでは、ユーザーが結果をリストするためのCompanyNameを定義できるようにします。bind()を使用することで、ユーザーがアプリケーションに対して任意のSQLを実行すること(いわゆる「SQLインジェクション」)を防ぎ、データベースを削除または変更することを防ぎます。all()を呼び出して、すべての行(またはクエリが返さない場合はなし)を返します。- クエリ結果があれば、
Response.json(results)を使用してJSON形式で返します。
- TypeScriptコード内でD1データベースへのバインディングを定義します。このバインディングは、
Workerを構成した後、グローバルにデプロイする前にプロジェクトをローカルでテストできます。
プロジェクトディレクトリ内で、データベースをローカルでテストします。
-
wrangler devを実行します:Terminal window npx wrangler devwrangler devを実行すると、WranglerはWorkerを確認するためのURL(おそらくlocalhost:8787)を提供します。 -
URLに移動します。
ページには「Bs Beveragesで働いている全員を見るには/api/beveragesを呼び出してください」と表示されます。
-
データベースが正常に動作しているかテストします。提供されたWrangler URLに
/api/beveragesを追加します。例えば、localhost:8787/api/beveragesです。
成功すれば、ブラウザにデータが表示されます。
Workerを本番環境にデプロイするには、最初にデータベースのブートストラップ手順を繰り返す必要がありますが、--localフラグを--remoteフラグに置き換えて、Workerに読み取るデータを提供します。これにより、データベーステーブルが作成され、Cloudflareのグローバルネットワーク上で実行される本番版のデータベースにデータがインポートされます。
-
ステップ4で作成した
schema.sqlファイルを使用してデータベースをブートストラップします:Terminal window npx wrangler d1 execute prod-d1-tutorial --remote --file=./schema.sql -
データが本番環境に存在することを確認するために、次のコマンドを実行します:
Terminal window npx wrangler d1 execute prod-d1-tutorial --remote --command="SELECT * FROM Customers" -
Workerをデプロイして、プロジェクトをインターネット上でアクセス可能にします。次のコマンドを実行します:
Terminal window npx wrangler deployOutputs: https://d1-tutorial.<YOUR_SUBDOMAIN>.workers.dev
これで、新しく作成したプロジェクトのURLにアクセスして、ライブデータベースをクエリできます。
例えば、新しいWorkerのURLがd1-tutorial.<YOUR_SUBDOMAIN>.workers.devの場合、https://d1-tutorial.<YOUR_SUBDOMAIN>.workers.dev/api/beveragesにアクセスすると、ライブデータベースを直接クエリするWorkerにリクエストが送信されます。
データベースを削除するには、次のコマンドを実行します:
npx wrangler d1 delete prod-d1-tutorialWorkerを削除したい場合は、次のコマンドを実行します:
npx wrangler delete d1-tutorialこのチュートリアルでは、以下のことを行いました:
- D1データベースを作成しました
- そのデータベースにアクセスするWorkerを作成しました
- プロジェクトをグローバルにデプロイしました
機能リクエストがある場合やバグを見つけた場合は、Cloudflare DevelopersコミュニティのDiscord ↗に参加して、Cloudflareチームに直接フィードバックを共有してください。
- D1のためのサポートされているWranglerコマンドを確認してください。
- Worker内でD1クライアントAPIを使用する方法を学んでください。
- D1上に構築されたコミュニティプロジェクトを探索してください。