コンテンツにスキップ

Python WorkersからD1をクエリする

Python WorkerからD1をクエリする方法を学ぶ

Cloudflare Workersプラットフォームは、複数の言語をサポートしており、TypeScript、JavaScript、Rust、Pythonが含まれます。このガイドでは、Pythonを使用してD1データベースをクエリし、アプリケーションをグローバルにデプロイする方法を示します。

前提条件

始める前に、次のことを確認してください:

  1. D1チュートリアルをTypeScriptとJavaScript用に確認し、D1データベースを作成し、Workersプロジェクトを構成する方法を学びます。
  2. Python言語ガイドを参照して、WorkersプラットフォームでのPythonサポートの仕組みを理解します。
  3. Python言語に基本的な親しみを持っていること。

Cloudflare Workersが初めての場合は、この例を続ける前に始めるガイドを最初に確認してください。

Pythonからのクエリ

この例では、既存のD1データベースがあることを前提としています。Python Workerがデータベースをクエリできるようにするには、まずWorkerとD1データベースの間にバインディングを作成し、これをwrangler.toml構成ファイルに定義する必要があります。

D1データベースのdatabase_namedatabase_idが必要です。新しいデータベースを作成するか、既存のデータベースのIDを取得するために、wrangler CLIを次のように使用できます:

データベースを作成
npx wrangler d1 create my-first-db
データベースIDを取得
npx wrangler d1 info some-existing-db
# ┌───────────────────┬──────────────────────────────────────┐
# │ │ c89db32e-83f4-4e62-8cd7-7c8f97659029 │
# ├───────────────────┼──────────────────────────────────────┤
# │ name │ db-enam │
# ├───────────────────┼──────────────────────────────────────┤
# │ created_at │ 2023-06-12T16:52:03.071Z │
# └───────────────────┴──────────────────────────────────────┘

1. バインディングの構成

wrangler.tomlファイルに、新しい[[d1_databases]]構成ブロックを作成し、database_namedatabase_idをクエリしたいD1データベースの名前とIDに設定します:

name = "python-and-d1"
main = "src/entry.py"
compatibility_flags = ["python_workers"] # Python Workersに必要
compatibility_date = "2024-03-29"
[[d1_databases]]
binding = "DB" # これがWorker内でデータベースを参照する方法になります
database_name = "YOUR_DATABASE_NAME"
database_id = "YOUR_DATABASE_ID"

bindingの値は、Worker内からデータベースを参照する方法です。これを変更した場合は、Workerスクリプト内でも変更する必要があります。

2. Python Workerの作成

Python Workerを作成するには、src/entry.pyに空のファイルを作成し、wrangler.tomlファイルのmainの値に一致する内容を以下に記述します:

from js import Response
async def on_fetch(request, env):
# リクエスト時に他にやりたいことをここに記述!
# D1をクエリ - この例ではデータベース内のすべてのテーブルをリストします
results = await env.DB.prepare("PRAGMA table_list").all()
# JSONレスポンスを返す
return Response.json(results)

wrangler.tomlファイルのbindingの値は、Pythonコード内の変数名と正確に一致する必要があります。この例では、DBバインディングを介してデータベースを参照し、await env.DB.prepare(...)を介してこのバインディングをクエリします。

次に、Python Workerを直接デプロイできます:

Terminal window
npx wrangler deploy
# 例の出力
#
# あなたのWorkerは以下のバインディングにアクセスできます:
# - D1データベース:
# - DB: db-enam (c89db32e-83f4-4e62-8cd7-7c8f97659029)
# 合計アップロード:0.18 KiB / gzip: 0.17 KiB
# python-and-d1をアップロードしました (4.93秒)
# python-and-d1を公開しました (0.51秒)
# https://python-and-d1.YOUR_SUBDOMAIN.workers.dev
# 現在のデプロイID: 80b72e19-da82-4465-83a2-c12fb11ccc72

あなたのWorkerはhttps://python-and-d1.YOUR_SUBDOMAIN.workers.devで利用可能になります。

デプロイ時にエラーが発生した場合:

  • wrangler.tomlに有効なD1データベースのdatabase_iddatabase_nameが構成されていることを確認してください。
  • wrangler.tomlcompatibility_flags = ["python_workers"]が設定されていることを確認してください。これはPythonに必要です。
  • エラーコードのリストを確認し、コードが未処理の例外をスローしないことを確認してください。

次のステップ