@astrojs/ db
Astro DBはAstroのために設計されたSQLベースのデータベースです。ローカル環境で開発し、Astro Studio dashboardからデプロイしましょう。
強力なローカルの型安全ツールを備えたAstro DBを使用し、リレーショナルデータベースとしてコンテンツをモデル、またはクエリしましょう。インタラクティブなStudio Dashboardから、ホストされているリモートデータを表示、管理、デプロイできます。
インストール
セクションタイトル: インストールAstroは公式インテグレーションのセットアップを自動化するために標準でastro add
コマンドを搭載しています。自動で行いたくない場合、手動でインテグレーションをインストールすることもできます。
以下のコマンドの内いずれか一つをターミナルで実行してください。
npx astro add db
pnpm astro add db
yarn astro add db
手動でのインストール
セクションタイトル: 手動でのインストールAstroDBのインストールを手動で行いたい場合、astro add
コマンドを実行するのではなく、以下のステップに従って手動でインストールしてください。
1. npmのパッケージマネージャー経由でインテグレーションをインストールする
セクションタイトル: 1. npmのパッケージマネージャー経由でインテグレーションをインストールするnpm install @astrojs/db
pnpm add @astrojs/db
yarn add @astrojs/db
2. インテグレーションをastro.config.mjs
に追加する
セクションタイトル: 2. インテグレーションをastro.config.mjsに追加するimport { defineConfig } from 'astro/config';import db from '@astrojs/db';
export default defineConfig({ integrations: [ db() ]});
3. データベースを設定する
セクションタイトル: 3. データベースを設定するプロジェクトディレクトリの一番高い階層にdb/config.ts
を作成してください。このファイルはAstroが自動的にロードする特別なファイルで、データベーステーブルを設定するのに使用されます。
import { defineDb } from 'astro:db';
export default defineDb({ tables: {},})
テーブル構成の参照
セクションタイトル: テーブル構成の参照columns
セクションタイトル: columnsテーブルの行の設定をするには、以下のコードのようにcolumns
オブジェクトを使用します。
import { defineTable, column, NOW } from 'astro:db';
const Comment = defineTable({ columns: { id: column.number({ primaryKey: true }), author: column.text(), content: column.text({ optional: true }), published: column.date({ default: NOW }), },});
テーブルの行を細かく設定するには column
ユーティリティーを使用します。column
は以下の型に対応しています。
column.text(...)
- プレーンまたはリッチテキストを保存column.number(...)
- 整数(integer)や浮動小数点数(float)を保存するcolumn.boolean(...)
- trueまたはfalseの値を保存するcolumn.date(...)
- データストレージ向けにISO StringとしてパースされたDate
オブジェクトを保存するcolumn.json(...)
- データストレージ向けに文字列されたJSONとしてパースされた任意のJSON blobを保存する
以下の追加設定は全ての列で共通に使用できます。
primaryKey
-number
またはtext
の列をユニークな識別子として設定します。optional
- Astro DBはNOT NULL
オプションを標準で使用しています。nullな値に対応したい場合位はoptional
の値をtrue
に設定してください。default
- 新しく追加された値のデフォルト値を設定します。デフォルト値としてAstroDBは静的な値かSQLによって生成されたタイムスタンプのような文字列のいずれかを受け付けます。unique
- この列をユニークと設定します。これにより、テーブル上のエントリ間で値が重複することを防げます。references
- 関連したテーブルを列ごとに参照します。これにより、外部キー制約が設定されます。参照を設定する場合、参照先のテーブルと参照している列が同じ値を持つ必要があります。
indexes
セクションタイトル: indexesテーブルインデックスは与えられた列や列の組み合わせを探すスピードを向上させるために使用されます。indexes
プロパティはユニークなインデックス名を持つオブジェクトをKeyとして受け入れます。
import { defineTable, column } from 'astro:db';
const Comment = defineTable({ columns: { authorId: column.number(), body: column.text(), }, indexes: { author_idx: { on: ["authorId"], unique: true }, }, });
各インデックスには、以下のような追加設定が可能です。
on
:string | string[]
- インデックスする単一の列、または複数の列が入っている配列。unique
:boolean
- ユニークな値をインデックスされた列に強制するにはtrue
に設定してください。
foreignKeys
セクションタイトル: foreignKeysforeignKeys
は複数のテーブルの列を関連付けるのに使用される高度なAPIです。もし参照する必要があるのが一つの列のみである場合、列のreferences
プロパティを使用するようにしてください。
Foreign keysは二つのテーブル同士を関連づけるために使用されます。foreignKeys
プロパティはテーブルの列同士を関連づける設定オブジェクトが入った配列を受け入れます。
import { defineTable, column } from 'astro:db';
const Author = defineTable({ columns: { firstName: column.text(), lastName: column.text(), }, });
const Comment = defineTable({ columns: { authorFirstName: column.text(), authorLastName: column.text(), body: column.text(), }, foreignKeys: [ { columns: ["authorFirstName", "authorLastName"], references: () => [Author.columns.firstName, Author.columns.lastName], }, ], });
各キー設定オブジェクトは以下のようなプロパティを受け入れます。
columns
:string[]
- 参照されたテーブルと関連づける列名の配列references
:() => Column[]
- 参照されたテーブルの列を配列として返す関数
Astro DB CLI レファレンス
セクションタイトル: Astro DB CLI レファレンスAstro DBにはAstro Studioのアカウントやホストされたデータベースと対話するためのCLIコマンドが含まれています。
これらのコマンドはGitHub CIアクションを使用している場合は自動的に実行されます。astro db
CLIを使用することで手動でコマンドを実行することもできます。
astro db push
セクションタイトル: astro db pushフラグ
--force-reset
重大なスキーマの変更が必要な場合に、全てのプロダクションデータをリセットする
データベースの変更をプロジェクトデータベースに安全にプッシュします。このコマンドはデータ損失のリスクを確認し、推奨された移行手順を案内します。もし重大なスキーマの変更を行わなければいけない場合、--force-reset
フラグを使用してプロダクションデータを1度全てリセットしてください。
astro db verify
セクションタイトル: astro db verifyローカルのデータベースとリモートのデータベースの設定を違いを確認します。このコマンドはastro db push
が実行された時に自動的に実行されます。verify
はローカルのdb/config.ts
ファイルをリモートのデータベースと比較し、変更があった場合は警告します。
astro db execute <file-path>
セクションタイトル: astro db execute <file-path>フラグ:
--remote
Studioのプロジェクトのデータベースに対して実行します。開発用サーバーに対して実行したい場合は省略してください。
.ts
または.js
ファイルを実行し、データベース上で読み書きを行います。このコマンドはファイルパスを引数として受け入れ、型安全なクエリを書くためのastro:db
モジュールの使用もサポートしています。Studioのプロジェクトのデータベースに対して実行したい場合は--remote
フラグを、開発用サーバーに対して実行したい場合は--remote
フラグを省いて実行してください。サンプルファイルを見るには開発データのシードを確認してください。
astro db shell --query <sql-string>
セクションタイトル: astro db shell --query <sql-string>フラグ:
--query
実行したいプレーンなSQLクエリ--remote
Studioのプロジェクトのデータベースに対して実行します。開発用サーバーに対して実行したい場合は省略してください。
SQLクエリをデータベースに対して実行します。Studioのプロジェクトのデータベースに対して実行したい場合は--remote
フラグを、開発用サーバーに対して実行したい場合は--remote
フラグを省いて実行してください。
Astro DB utility レファレンス
セクションタイトル: Astro DB utility レファレンスisDbError()
セクションタイトル: isDbError()isDbError()
関数はエラーがlibSQLデータベースの例外であるか確認します。This may include a レファレンスを使用するときに起こるforeign key制約エラーやデータを追加するときに必要な情報が足りないかどうかも含まれます。 isDbError()
と try / catch ブロックと合わせて使用してデータベースのエラーを処理することもできます。
import { db, Comment, isDbError } from 'astro:db';import type { APIRoute } from 'astro';
export const POST: APIRoute = (ctx) => { try { await db.insert(Comment).values({ id: ctx.params.id, content: 'Hello, world!' }); } catch (e) { if (isDbError(e)) { return new Response(`Cannot insert comment with id ${id}\n\n${e.message}`, { status: 400 }); } return new Response('An unexpected error occurred', { status: 500 }); }
return new Response(null, { status: 201 });};