2022年5月、当社はデータベースの簡素化(データベースの構築、保守、統合)を追求することを発表しました。当社の目標は、最先端のパフォーマンスを備えた強力でスケーラブルなデータベースを、いかなる煩わしさもなく、実行できるようにするツールをお客様に提供することです。そして、当社は最初に、データベースの専門家だけでなく、あらゆるタイプのユーザーのデータベース開発経験を再考することを目指しました。
この数カ月間、それだけを作成するために取り組み、一方その過程でいくつかの非常に重要な教訓を学びました。Workers上でグローバルなリレーショナルデータベース製品を構築することは、開発者プラットフォームの境界を絶対的な限界まで押し上げ、しばしばそれを超えますが、Cloudflare の私たちにとっては非常にスリリングな方法であるということが分かりました。当社の進歩は、外部からは遅いように見えるかもしれません。しかし、すべての改善、バグ修正またはストレステストは、_すべての_お客様が、世界で最も意欲的なサーバーレスアプリケーションを構築するための道筋を築くのに役立つということです。
しかし、D1の生産準備をするまでの道のりは続き、まだ_完全には_完成していませんが、まずフィードバックを求めて立ち止まらなければ、それは「Cloudflare流」とは言えません。Developer Weekの精神において、D1 Open Alphaを導入するのにこれ以上の好機はありません!
「Open Alpha」は、私たちにとって新しい概念です。Cloudflareの様々な発表で「オープンベータ」という言葉を耳にすると思いますが、ここの多くの製品にも言えることですが、D1には全く適していませんでした。まだアクティブな開発とテストの段階にある極めて重要な部分がまだいくつかあるため、実際のアプリの構築を開始できるように、完全に形成されたD1をパブリックベータ版としてリリースする前に、趣味のアプリやサイドプロジェクトで製品の感触をつかむことができるようにしたいと考えています。
Alphaには何が含まれているのですか?
D1の舞台裏ではまだ多くのことが変化していますが、開発者としてのあなたがデータベースを初めて使う場合であっても、D1とのかかわり方について多くのことを考慮してきました。
D1ダッシュボードの使用
数回クリックするだけで簡単に、ダッシュボード内からD1データベースを立ち上げ、実行することができます。D1インターフェースでは、自由にデータを作成、維持、表示できます。UIで行われた変更は、すぐにWorkerで利用できますー再デプロイは必要ありません!
Wranglerを使う
もし少しやってみたいという関心があるのでしたら、Wrangler CLIを使用してデータベースを操作することもできます。データベースを作成し、手動でデータの追加を開始するか、次の2つの方法のいずれかでデータベースをブートストラップします。
1. SQLファイルを実行する
あなたの .sql
ファイルは次のようになります。
$ wrangler d1 execute my-database-name --file ./customers.sql
customers.sql
2. マイグレーションの作成と実行
DROP TABLE IF EXISTS Customers;
CREATE TABLE Customers (CustomerID INT, CompanyName TEXT, ContactName TEXT, PRIMARY KEY (`CustomerID`));
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 では、マイグレーションを作成し、それをデータベースに適用することができます。
マイグレーションを作成するために、以下を実行します。
これで、 migrations
フォルダにSQLファイルが作成され、そこにクエリを追加できるようになります。その後、以下を実行することでデータベースにマイグレーションを適用します。
wrangler d1 migrations create <my-database-name> <short description of migration>
Worker内からD1へアクセスする
wrangler d1 migrations apply <my-database-name>
wrangler.toml
設定ファイルにD1バインディングを追加することで、WorkerにD1をアタッチできます。次に、Worker内で以下のようにクエリを実行することで、D1とやりとりできます。
または、Pages FunctionからD1へアクセスする
export default {
async fetch(request, env) {
const { pathname } = new URL(request.url);
if (pathname === "/api/beverages") {
const { results } = await env.DB.prepare(
"SELECT * FROM Customers WHERE CompanyName = ?"
)
.bind("Bs Beverages")
.all();
return Response.json(results);
}
return new Response("Call /api/beverages to see Bs Beverages customers");
},
};
今回のアルファ版では、D1はCloudflare Pagesとの統合もサポートしています。Pagesダッシュボード内にD1バインディングを追加し、Pages Function内にクエリを記述して、フルスタックアプリケーションを構築することができます。PagesとD1を始めるには、完全なドキュメントをチェックしてみてください。
コミュニティが構築したツール
プライベートアルファ版の期間中、D1にある熱狂は、コミュニティのメンバーによるD1エコシステムと開発者エクスペリエンスへの貴重な貢献へとつながりました。これまでのプロジェクトの中から、特にお気に入りのものを以下にご紹介します。
d1-orm
ORM(オブジェクトリレーショナルマッピング)とは、JavaScriptを使ってデータを問い合わせ・処理する方法です。Cloudflare Discord Community Championによって作成されたd1-orm
は、D1使用時に厳密な型付け体験を提供することを目的としています。
完全なドキュメントをご覧いただき、 GitHubリポジトリで問題を作成してフィードバックを提供することができます。
const users = new Model(
// table name, primary keys, indexes etc
tableDefinition,
// column types, default values, nullable etc
columnDefinitions
)
// TS helper for typed queries
type User = Infer<type of users>;
// ORM-style query builder
const user = await users.First({
where: {
id: 1,
},
});
workers-qb
これはゼロ依存性のクエリビルダで、従来のORMよりも生のクエリを使用する利点と速度を維持しながら、シンプルな標準化されたインタフェースを提供します。ORMのような機能を提供することは意図していませんが、workers-qb
により、コードからSQLに直接アクセスすることでデータベースとのやりとりを容易にします。
クエリビルダの詳細については、こちらをご覧ください。
const qb = new D1QB(env.DB)
const fetched = await qb.fetchOne({
tableName: 'employees',
fields: 'count(*) as count',
where: {
conditions: 'department = ?1',
params: ['HQ'],
},
})
d1-console
データベースを操作するたび、ターミナルで wrangler d1 execute
コマンドを実行する代わりに、d1-console
内で D1を操作することができます。Discord Community Championによって作成されたもので、複数行のクエリの実行、コマンド履歴の取得、きれいにフォーマットされたテーブル出力の表示などの利点があります。
これは現在コミュニティプロジェクトですが、将来的には「D1 Console」をネイティブにサポートする予定です。今現在は、こちらから d1-console
パッケージをチェックして始めてみてください。
用D1アダプター
Kyselyは、型安全性があり、自動補完に適したTypeScriptのSQLクエリビルダです。このアダプターを使うと、使い慣れたKyselyのインターフェースでD1とやりとりできます。
こちらからプロジェクトをチェックしてください。
// Create Kysely instance with kysely-d1
const db = new Kysely<Database>({
dialect: new D1Dialect({ database: env.DB })
});
// Read row from D1 table
const result = await db
.selectFrom('kv')
.selectAll()
.where('key', '=', key)
.executeTakeFirst();
まだテスト段階のものは?
このAlphaリリースで無効にされた最大のものは、レプリケーションとJavaScriptトランザクションのサポートです。これらの変更は徐々に展開していきますが、現在、存在するいくつかの制限(積極的にテストに取り組んでいる)について呼びかけたいと思います:
● **データベースの場所:**各D1データベースは、単一のインスタンスのみ実行します。これは、開発者であるあなたがデータベースを作成する場所の近くで作成され、現在アクセスパターンに基づいて地域を移動することはありません。世界各地で実行しているWorkersは、結果として遅延がより高くなります。
● **並行処理制限:**高負荷時には、読み取りや書き込みクエリは、新しいレプリカの作成をトリガーするのではなく、キューに入れられることがあります。その結果、Open Alpha のパフォーマンスとスループットの特性は、最終製品を代表するものではなくなります。
● **可用性の制限:**バックアップの実行中は、DBへのアクセスをブロックします。ほとんどの場合、これは1〜2秒程度であり、バックアップ中に到着したリクエストはキューに入れられます。
また、D1 Alpha Limitationsで、より詳細な最新リストを確認することができます。
フィードバックのリクエスト
D1をご利用になりたいデータベースの種類で、当社はあらゆる種類の推測や手だてを行うことができますが、当社はユーザーではないのです–ユーザーはお客様です私たちは、あらゆる立場の開発者に、初期段階のD1技術を試してもらい、あなたの製品アプリに適したものにするために、改善点を教えてもらいたいと考えています。
体験に関する一般的なフィードバックや、Alphaの他の人々と交流するには、Cloudflare Developers Discordの#d1-open-alphaチャンネルに参加してください。重要なお知らせや変更は、このチャンネルや毎月のコミュニティコールで行う予定です。
より具体的な機能要望(どんなに奇抜なものでも)やバグの報告は、CloudflareコミュニティフォーラムのD1カテゴリーにスレッドを作成してください。このフォーラムは、数ヶ月先のプランを立てるための手段として維持していく予定です。
追伸:募集中です。
ご興味を持たれましたか?もしあなたが、未知の問題を解決し、スケールの大きなパワフルな製品を作るのがお好きでしたら、D1チームは採用中です。募集中の職種をぜひご覧ください。