記事一覧
開発者向け·7分で読めます

b77データベースの使い方:コレクション、絞り込み、ユーザーごとのデータ

builder77のアプリにはデータベースが最初から入っています。コレクション、絞り込み、並べ替え、ユーザーごとのレコードの仕組みと、非公開のデータを守る方法を説明します。

77
builder77チーム
builder77.com

ほとんどの場合、データベースを直接触ることはありません。アプリの内容を伝えれば、データを保存したり読み込んだりするコードはbuilder77が書きます。それでも仕組みを知っておくと、より良いプロンプトが書け、問題も早く見つけられ、プライバシーについても正しく判断できます。ここでは b77.db をひととおり紹介します。

コレクションとレコード

データはコレクションに入ります。コレクションとは、tasks、bookings、posts のように名前の付いたレコードのまとまりです。スキーマを定義する必要はありません。コレクションは最初に書き込んだときに作られ、各レコードは、渡したフィールドをそのまま持つシンプルなオブジェクトです。

js
const task = await b77.db.create('tasks', { title: 'Write launch post', done: false });
// -> { id, title, done, createdAt, updatedAt, ownerId }

id、createdAt、updatedAt、ownerId はbuilder77が自動で付けます。ownerId には、ログイン中のアプリのユーザーがいればそのユーザーが入ります。これは、あとで説明する権限で大事になります。

データの読み取り:list、get、count

js
const open = await b77.db.list('tasks', {
  where: { done: false },   // exact-match filter
  sort: '-createdAt',       // '-' = descending
  limit: 50                 // up to 500
});

const one = await b77.db.get('tasks', id);          // record or null
const doneCount = await b77.db.count('tasks', { where: { done: true } });

where はフィールドの完全一致で絞り込みます。状態での絞り込み、カテゴリ、関連レコードの親IDなど、アプリで必要なことはたいていこれで足ります。それほど多くない一覧を入力しながら検索したいときは、レコードを読み込んでからブラウザ側で絞り込むのが一般的です。

更新と削除

js
await b77.db.update('tasks', id, { done: true });   // shallow merge
await b77.db.remove('tasks', id);

update は渡したフィールドを既存のレコードにマージするので、変わった部分だけを送れば十分です。

mine: true でユーザーごとのデータを扱う

日記、家計簿、習慣トラッカーのように、一人ひとりが自分のデータを持つアプリでは、b77.auth と mine オプションを組み合わせます。ユーザーがログインしているとき、mine: true を指定すると、そのユーザーが作ったレコードだけが返ります。

js
await b77.auth.signIn({ email, password });

const myEntries = await b77.db.list('entries', { mine: true, sort: '-createdAt' });

保護はもう一段あります。ログイン中のユーザーが作ったレコードは、そのユーザー本人しか更新や削除ができません。誰かが手作業でリクエストを組み立てても、自分のものではないレコードの編集はAPIが拒否します。

公開データと非公開データ:早わかりガイド

  • 公開するコンテンツ(メニュー、ブログ記事、商品一覧):読むのにログインは不要です。builder77に最初のデータを入れてもらうか、管理画面を追加してもらえば管理でき、データタブでいつでも編集できます。
  • 送信されるもの(お問い合わせフォーム、キャンセル待ち、予約):誰でも作成でき、あなたはデータタブで読みます。
  • 個人のデータ(メモ、健康記録、お金の記録):ログインを必須にし、必ず mine: true で取得します。

覚えておきたい原則があります。アプリのフロントエンドのコードにあるものは訪問者から見えます。そのため、誰が何を読めるかは、各コレクションのアクセスルールによってサーバー側で決まります。カタログにはreadonly、フォームや注文にはsubmit(見られるのはあなただけ)、個人のデータにはprivateです。builder77はコレクションの名前から安全なルールを選び、データタブで変更もできます。誰でも読んだり変更したりできるのは、あなたがはっきりpublicにしたコレクションだけです。アプリの中で注文や予約を管理したいときは、データ → 管理者として開くからアプリを開きます。アプリ全体があなたやチームだけのものなら、設定で非公開アプリをオンにしてください。

データタブ

ビルダーのダッシュボードタブにあるデータでは、すべてのコレクションを見たり、レコードを編集・削除したり、アプリのユーザーやアップロードされたファイルを確認したりできます。コンテンツの誤字を直す、テストで入れたデータを片づける、フォームが期待どおりに保存しているか確かめる、といったことがいちばん早くできる場所です。

Flutterや他のクライアントからも同じデータを使う

WebのSDKはREST APIを薄く包んだもので、Flutterへのエクスポートでも同じREST APIを使います。つまり、どのクライアントからでも同じコレクションを読み書きできます。

http
GET  /api/runtime/<projectId>/db/tasks?where={"done":false}&sort=-createdAt&limit=100
POST /api/runtime/<projectId>/db/tasks   { "data": { "title": "Hi" } }
Authorization: Bearer <appUserToken>   (optional, from /auth/signin)

アプリのユーザーのトークンは1つのプロジェクトでしか使えないため、あるアプリのトークンを別のアプリで使うことはできません。データベースの読み書きにクレジットはかからないので、プランのレコード数の上限内であれば、データを多く扱うアプリでも気にせず作れます。

データについてのプロンプト

こうしたことは、すべて普段の言葉で指示できます。たとえば「支出を金額、カテゴリ、日付で保存して。各ユーザーは自分の分だけ見られるように」や「予約に状態のフィールドを追加して、未確定のものを絞り込めるようにして」です。AIはSDKを理解しているので、たいていはデータの形を説明するだけで十分です。

さっそく作ってみませんか

アイデアを伝えるだけで、1分ほどで動く最初のバージョンができあがります。無料で始められ、クレジットカードも不要です。