`verify` - スキーマ変更の検証
v1.24.0で追加
スキーマの更新や不適切に書かれたクエリは、本番データベースをダウンさせることがよくあります。これは良くありません。
デフォルトでは、sqlc generate
はこれらの問題の一部をキャッチします。sqlc/db-prepare
ルールを使用してsqlc vet
を実行すると、より微妙な問題をキャッチします。しかし、現在のスキーマとクエリだけを見ていては、sqlcが防げない問題の大きなクラスが存在します。
例えば、スキーマ変更が提案された場合、本番環境で実行されている既存のクエリとコードは、スキーマ変更が適用されると失敗する可能性があります。sqlc verify
の登場です。これは、既存のクエリを新しいスキーマ変更に対して分析し、問題がある場合はエラーを出します。
例を見てみましょう。本番環境にこれら2つのテーブルがあると仮定します。
CREATE TABLE users (
id UUID PRIMARY KEY
);
CREATE TABLE user_actions (
id UUID PRIMARY KEY,
user_id UUID NOT NULL,
action TEXT,
created_at TIMESTAMP
);
あなたのアプリケーションには、usersテーブルに対してuser actionsを結合する以下のクエリが含まれています。
-- name: GetUserActions :many
SELECT * FROM users u
JOIN user_actions ua ON u.id = ua.user_id
ORDER BY created_at;
これまでは良好です。次に、このスキーマ変更を提案するとします:
ALTER TABLE users ADD COLUMN created_at TIMESTAMP;
この変更でsqlc generate
を実行すると、column reference "created_at" is ambiguous
エラーが返されて失敗します。問題を修正するためにクエリを更新します。
-- name: GetUserActions :many
SELECT * FROM users u
JOIN user_actions ua ON u.id = ua.user_id
ORDER BY u.created_at;
この変更は問題を修正しますが、本番環境の停止が待ち受けています。スキーマ変更が適用されると、既存のGetUserActions
クエリが失敗し始めます。これを修正する正しい方法は、スキーママイグレーションを適用する前に更新されたクエリをデプロイすることです。
マイグレーションが安全にデプロイできることを確認するために、現在のスキーマとクエリをsqlc cloudに送信します。そこで、最新のプッシュに対するクエリを新しいスキーマ変更に対して実行します。このチェックは、既存のクエリに対する後方互換性のないスキーマ変更をキャッチします。
ここで、sqlc verify
はORDER BY “created_at"があいまいであることを警告します。
$ sqlc verify
FAIL: app query.sql
=== Failed
=== FAIL: app query.sql GetUserActions
ERROR: column reference "created_at" is ambiguous (SQLSTATE 42702)
ちなみに、このシナリオは作り話ではありません!数週間前に私たちに起こったことです。私たちは過去2週間、verify
の初期バージョンを幸せにテストしており、それ以来問題は発生していません。
この種の検証は始まりに過ぎません。あなたのアプリケーションが顧客によってオンプレミスでデプロイされている場合、verify
は、スキーママイグレーションが実行された後でも、顧客がアプリケーションの古いバージョンにロールバックすることが安全かどうかを知らせることができます。
sqlc verify
を使用するには、アプリケーションのリリースにタグを付けるときにクエリとスキーマをプッシュする必要があります。私たちは継続的にコミットを本番環境にデプロイするため、mainへのすべてのプッシュで実行しています。
認証
sqlc
は、SQLC_AUTH_TOKEN
環境変数の値で有効な認証トークンを見つけることを期待しています。認証トークンはダッシュボード経由で作成できます。
export SQLC_AUTH_TOKEN=sqlc_xxxxxxxx
期待されるワークフロー
sqlc verify
を使用するには、クエリとスキーマをsqlc Cloudにプッシュする必要があります。アプリケーションの新しいバージョンをリリースするときは、スキーマとクエリもプッシュする必要があります。例えば、私たちは本番環境にすべてのコミットをデプロイするため、Githubのmainブランチへのあらゆる変更がマージされた後にsqlc push
を実行しています。
$ sqlc push --tag main
ローカルでまたはプルリクエストで、sqlc verify
を実行して、既存のクエリが現在のデータベーススキーマで引き続き動作することを確認します。
$ sqlc verify --against main
タグの選択
against
引数なしでは、verify
は最も最近プッシュされたクエリを使用して、提供されたスキーマの分析を実行します。比較のために明示的にクエリのセットを選択するために、against
引数を使用することをお勧めします。
$ sqlc verify --against [tag]
原文:https://docs.sqlc.dev/en/latest/howto/verify.html