Astro DB
Astro DBは、Astro専用に設計されたフルマネージドSQLデータベースです。ローカルでの開発も、Astro Studioプラットフォームで管理されているホストされたデータベースへの接続も可能です。
インストール
セクションタイトル: インストール(v0.8.1
以降の)@astrojs/db
インテグレーションを使用して、新しいAstroプロジェクトまたは既存のプロジェクト(astro@4.5
以降が必要です)にAstro DBを追加します。Astroには、このセットアッププロセスを自動化するための組み込みのastro add
コマンドが含まれています。
必要に応じて、@astrojs/db
の手動インストールも可能です。
データベースの定義
セクションタイトル: データベースの定義Astro DBは、データの設定、開発、およびクエリをおこなうための完全なソリューションです。astro dev
の実行ごとにローカルデータベースが作成されますが、LibSQLを使用してデータを管理するため、Dockerやネットワーク接続は必要ありません。
astro add
コマンドで@astrojs/db
をインストールすると、プロジェクトにdb/config.ts
ファイルが作成されます。ここにデータベースのテーブルを定義します。
テーブル
セクションタイトル: テーブルAstro DBでは、データはSQLテーブルを使用して保存されます。テーブルはデータを行と列に構造化し、列は各行の値の型を強制します。
テーブルを定義すると、プロジェクトからそのテーブルにクエリするためのTypeScriptのインターフェースが、Astroによって生成されます。これにより、データにアクセスする際に、プロパティの自動補完や型チェックなどの完全なTypeScriptのサポートが得られます。
データベーステーブルを設定するには、astro:db
からdefineTable()
とcolumn
ユーティリティをインポートして使用します。
以下の例では、必須のテキストカラムauthor
とbody
をもつComment
テーブルを設定しています。そして、defineDb()
をエクスポートしてプロジェクトで利用できるようにします。
Astro DBは、次のカラム型をサポートしています。
テーブルの参照
セクションタイトル: テーブルの参照テーブル間のリレーションは、データベース設計における一般的なパターンです。たとえば、Blog
テーブルはComment
やAuthor
、Category
など、他のテーブルと密接に関連しているかもしれません。
参照カラムにより、こうしたテーブル間のリレーションを定義し、データベーススキーマに保存できます。リレーションを設定するには、以下が必要です。
- 参照されるテーブルの識別子カラム。通常、
primaryKey
プロパティをもつid
カラムです。 - 参照される
id
を格納する、参照元テーブルのカラム。references
プロパティによりリレーションを設定します。
以下の例では、Comment
テーブルのauthorId
カラムがAuthor
テーブルのid
カラムを参照しています。
データベースのシード
セクションタイトル: データベースのシード開発中、AstroはDBの設定を使用して、スキーマに従ってローカルに型を生成します。これらの型は開発サーバーが起動するたびに新たに生成されるため、型安全性と自動補完のもとで、データの形状をクエリしたり操作したりできます。
テストやデバッグのために開発データをAstroプロジェクトにシードするには、db/seed.ts
ファイルを作成します。astro:db
からdb
オブジェクトと設定済みのテーブルをインポートし、db.insert()
関数を使用してテーブルの行データオブジェクトの配列を与えます。
以下の例では、Comment
テーブルに2行の開発用データを定義しています。
このファイルが変更されるたびに、開発サーバーは自動的にデータベースを再起動し、型を再生成してseed.ts
から開発データをシードします。
データベースへのクエリ
セクションタイトル: データベースへのクエリプロジェクト内の任意のAstroページやエンドポイントから、提供されるdb
ORMとクエリビルダーを使用してデータベースへのクエリができます。
Drizzle ORM
セクションタイトル: Drizzle ORMAstro DBには、組み込みのDrizzle ORMクライアントが含まれています。このクライアントを使用するためのセットアップや手動の設定は必要ありません。Astro DBのdb
クライアントは、Astroを実行すると(ローカルまたはリモートの)データベースと通信するように自動的に設定されます。また、データベーススキーマの定義を正確に使用して型安全なSQLクエリが可能になるため、存在しないカラムやテーブルを参照するとTypeScriptエラーが発生します。
Select
セクションタイトル: Select以下の例では、Comment
テーブルのすべての行を選択しています。これにより、db/seed.ts
からシードされた開発データの配列全体が返され、ページのテンプレートで使用できるようになります。
select()
のAPIリファレンスを参照してください。
Insert
セクションタイトル: Insertフォームからのリクエストを処理してリモートにホストされたデータベースにデータを挿入する場合のように、ユーザー入力を受け付けるためには、Astroプロジェクトをオンデマンドレンダリングに設定し、デプロイ環境向けのSSRアダプターを追加してください。
この例では、パースされたフォームのPOSTリクエストに基づいて、Comment
テーブルに行を挿入しています。
APIエンドポイントからデータベースをクエリすることも可能です。この例では、id
パラメータによってComment
テーブルから行を削除しています。
insert()
のAPIリファレンスを参照してください。
フィルタリング
セクションタイトル: フィルタリング特定のプロパティによってテーブルの結果をクエリするには、部分選択(partial select)のためのDrizzleオプションを使用します。たとえば、select()
クエリに.where()
呼び出しを追加し、必要な比較条件を渡します。
以下の例では、「Astro DB」というフレーズを含むComment
テーブルのすべての行をクエリしています。body
内にフレーズが存在するかどうかをチェックするためには、like()
オペレータを使用します。
Drizzleのユーティリティ
セクションタイトル: Drizzleのユーティリティクエリのビルドに使用するDrizzleユーティリティはすべて、astro:db
モジュールから公開されています。これには以下が含まれます。
リレーション
セクションタイトル: リレーションSQLの結合を使用して、複数のテーブルから関連するデータをクエリできます。結合クエリを作成するには、db.select()
文を結合演算子で拡張します。各関数は、結合するテーブルと、2つのテーブル間の行を一致させる条件を受け付けます。
この例では、innerJoin()
関数を使用して、Comment
の著者をauthorId
カラムに基づいて関連するAuthor
情報と結合しています。これにより、各Author
とComment
行をトップレベルのプロパティとしてもつオブジェクトの配列が返されます。
トランザクションのバッチ処理
セクションタイトル: トランザクションのバッチ処理リモートデータベースへのクエリはすべてネットワークリクエストとして実行されます。大量のクエリを実行する場合や、クエリが失敗した場合に自動的にロールバックするために、複数のクエリを1つのトランザクションへとまとめる必要がある場合があります。
この例では、db.batch()
メソッドを使用して、1つのリクエストで複数の行をシードしています。
db.batch()
のドキュメントを参照してください。
Astro Studio
セクションタイトル: Astro StudioAstro DBは、Astro Studioプラットフォームに接続して、ホストされたデータベースをプロジェクトに迅速に追加できます。Astro Studioのダッシュボードから、新しくホストされたデータベースを表示、管理、デプロイできます。
新しいプロジェクトを作成するには、既成のテンプレートを使用するか、Astro Studioガイドを確認してください。
テーブルスキーマのプッシュ
セクションタイトル: テーブルスキーマのプッシュプロジェクトが成長するにつれて、テーブルスキーマは変化します。ローカルで設定の変更を安全にテストした上で、デプロイ時にStudioのデータベースにプッシュできます。
ダッシュボードからStudioプロジェクトを作成する際、GitHubのCIアクションを作成するオプションがあります。これを使うと、リポジトリのメインブランチにマージする際に、スキーマの変更が自動的にマイグレーションされます。
また、astro db push
コマンドにより、CLIを通じてスキーマの変更をプッシュすることも可能です。
このコマンドは、データの損失なしに変更が可能であるかを検証し、コンフリクトを解消するための推奨されるスキーマ変更についてガイドします。破壊的なスキーマ変更をおこなう必要がある場合は、--force-reset
フラグを追加してすべての本番データをリセットしてください。
データのプッシュ
セクションタイトル: データのプッシュシードやデータのマイグレーションのために、Studioのデータベースにデータをプッシュする必要がある場合があります。これには、astro:db
モジュールを使用して.ts
ファイルを作成し型安全なクエリを書いた上で、astro db execute <file-path> --remote
コマンドにより、ファイルをStudioデータベースに対して実行します。
以下のCommentsは、astro db execute db/seed.ts --remote
コマンドを使用してシードできます。
Astro Studioへの接続
セクションタイトル: Astro Studioへの接続デフォルトでは、dev
またはbuild
コマンドを実行すると、Astroはローカルのデータベースファイルを使用します。各コマンドが実行されるたびにテーブルがゼロから再作成され、開発用のシードデータが挿入されます。
ホストされているStudioのデータベースに接続するには、--remote
フラグを追加します。本番環境でのデプロイにこのフラグを使用すると、Studioデータベースへの読み書きアクセスが可能になります。これにより、ユーザーデータを受け入れて永続化できます。
開発中に--remote
を使用する際は注意してください。これにより、稼働中の本番データベースに接続され、すべての挿入、更新、削除が永続化されます。
リモート接続を使用するには、Studioとの認証に使用するアプリトークンが必要です。トークンの作成と設定手順については、Studioダッシュボードを確認してください。
Astro DBインテグレーションの作成
セクションタイトル: Astro DBインテグレーションの作成Astroインテグレーションにより、Astro DBテーブルとシードデータを追加してユーザープロジェクトを拡張できます。
astro:db:setup
フック内でextendDb()
メソッドを使用して、追加のAstro DB設定とシードファイルを登録します。defineDbIntegration()
ヘルパーは、astro:db:setup
フックに対してTypeScriptサポートと自動補完を提供します。
インテグレーションの設定とシードファイルは、ユーザー定義のものと同じフォーマットに従います。
インテグレーションでの型安全な操作
セクションタイトル: インテグレーションでの型安全な操作インテグレーションでの作業中、astro:db
からエクスポートされる、Astroが生成したテーブル型を利用できないことがあります。完全な型安全性を確保するためには、asDrizzleTable()
ユーティリティを使用して、データベース操作に使用するテーブル参照オブジェクトを作成します。
たとえば、次のPets
というデータベーステーブルを定義するインテグレーションがあるとします。
シードファイルでPets
をインポートしてasDrizzleTable()
を使用すると、テーブルに行を挿入する際に型チェックをおこなえます。
asDrizzleTable('Pets', Pets)
から返される値は、import { Pets } from 'astro:db'
と同等ですが、Astroの型生成が実行できないような場合でも利用できます。データベースへのクエリや挿入が必要なインテグレーションコードで使用できます。