最初のクエリ
テーブルを作成し、データを保存してから取得するまでの基本的な流れを説明します。
テーブルを作成する
migrations/0001_init.sql ファイルを作成します。
create table posts (
id bigserial primary key,
title text not null,
created_at timestamptz not null default now()
);マイグレーションを適用します。
runlot pg migrateワーカーからデータを使う
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url);
if (request.method === "POST" && url.pathname === "/posts") {
const { title } = (await request.json()) as { title: string };
const rows = await env.db.exec(
"insert into posts (title) values ($1) returning id, title",
[title],
);
return Response.json(rows[0], { status: 201 });
}
const rows = await env.db.exec(
"select id, title, created_at from posts order by id desc limit 20",
);
return Response.json(rows);
},
};runlot deploy動作を確認する
curl -X POST https://my-app.me.runlot.app/posts \
-H 'content-type: application/json' \
-d '{"title":"hello"}'
curl https://my-app.me.runlot.app/postsCLI から直接確認することもできます。
runlot pg execute -c "select count(*) from posts"ダッシュボードのSQLコンソール
プロジェクトの データベース タブに SQLコンソール ボタンがあります。押すとエディタが開き、左側にテーブルの一覧が出ます。名前を押すと SELECT * FROM … LIMIT 100 を書いてくれます。実行は ⌘+Enter または Ctrl+Enter です。
データベースへの経路は psql と同じです。コンソールがこのプロジェクトの接続資格を持って同じエンドポイントに接続するため、ワイヤーで成り立つことはここでも成り立ちます。10秒の文の上限も、エラーも、SQLSTATE も同じです。
読み取り専用が既定です。 オンのままなら、文は読み取り専用トランザクションの中で実行され、成功しても失敗してもロールバックされるので、何を書いてもデータは変わりません。オフにすると一度確認を求め、その後は書き込みがそのまま反映され、取り消せません。戻すにはバックアップからの復元が必要です。
結果について知っておくことが2つあります。
- 最大 500行 まで表示します。この上限は応答にのみ適用され、あなたの文には付かないため、下に書かれた行数は文が実際に処理した数のままです。残りは
LIMITとOFFSETで送っていってください。 - 値は文字として表示し、
NULLと空文字列を区別して描きます。途中で JavaScript の数値に変換しないため、大きなbigintも桁がそのまま出ます。
文が拒否されると、PostgreSQL 自身のメッセージと SQLSTATE を併せて表示します。一意制約違反の 23505 のような5文字のコードです。PostgreSQL のマニュアルはこのコードで索引されているので、検索する価値があるのはその文字列です。
文を実行するには、接続情報を見るのと同じ member 権限が必要です。コンソールがその資格で動くからです。書き込みは組織の監査ログに残り、読み取りは残りません。
次のステップ
- SQLSTATE に応じてエラーを処理するには、tryExec を参照してください。
- node-postgres に近い API が必要な場合は、@runlot/pg を使用してください。
- ORM を使用する場合は、ORM を参照してください。