はじめに
前回はPagesからHTTPリクエストを送信し、Workersからレスポンスを受信するところまでをやりました。
今回は、データベースD1のセットアップを進めていきます。
D1セットアップ
まずターミナルからログインを。
npx wrangler login
D1データベースを作成していきます。
npx wrangler d1 create [db名]
作成したD1をバインドします。
私の場合はWorkersで使うのでWorkersのルートディレクトリにあるwrangler.tomlに以下の記述を追加していきます
[[d1_databases]]
binding = "DB" # i.e. available in your Worker on env.DB
database_name = "[db名]"
database_id = "[dbのid]"
これらはDB作成時、コマンドラインに表示されるので、それをコピペすればOKです。
これでDBの準備は完了です。適当なテーブルの作成とCRUD操作を試してみましょう。
なお、D1のsqlはsqliteと同じものでいいようです。Rustで書く時、sqlxのフィーチャーはsqliteでいいのかな...?
【追記】
sqlxはwasm非対応らしく使えませんでした。当然sqlxベースのsea-ormも使えません。
動作確認
とりあえず公式ドキュメントのサンプルのテーブルを突っ込んでみます。
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');
これをとりあえずルートディレクトリに配置しておいて実行してみる。
npx wrangler d1 execute [db名] --local --file=./schema.sql
ひとまずこれはリモートじゃなくローカルでのみ反映されるものらしいです。
とりあえずこれでいったんCRUDの確認をしてみましょう。
npx wrangler d1 execute [db名] --local --command="SELECT * FROM Customers"
npx wrangler d1 execute [db名] --local --command="INSERT INTO Customers VALUES (99, 'test', 'test name')"
npx wrangler d1 execute [db名] --local --command="UPDATE Customers SET CompanyName = 'renamed' WHERE CustomerId = 99"
npx wrangler d1 execute [db名] --local --command="DELETE FROM Customers WHERE CustomerId = 99"
結果は省略しますが、各動作ごとにSELECTした結果問題なく実行されていました。
今回はやりませんが、--localを--remoteに書き換えれば、cloudflare上に作成したDBが操作されます。
おわりに
次回はWokersからD1を操作してみようと思います。可能であればsea-ORMを導入しようと考えていますが......どうなるかな。
おまけ
記事を書いた後に「そういやローカルのd1はどこに保存されているんだろう...?」と思って探してみたら./.wrangler/state/v3/d1/miniflare-D1DatabaseObjectにありました。
DB Browser for SQLite等で中身を確認することもできます。