クエリを書き直さずにステージングと本番で SQL の値を使い回すには?
ステージングから本番へタブを移しても、制限、絞り込み、テスト用の値を差し替えられ、クエリは書き直しません。値は変数パネルにあり、タブの環境に従います。
ステージングでは、同じクエリでも小さい LIMIT、テスト用の id、偽のメール、きつめの絞り込みが欲しい。本番では値が違います。
置く場所がなければ、数字は各ステートメントに貼られます。タブがステージングから本番へ移ると、手で直します。SQL 本体のバインド($1、?)は、その実行のパラメーターを埋めます。環境ごとの値は持たず、タブにも付いていきません。
Kerry Studio は SQL の変数でこれを扱います。名前を値、リテラル、$faker. ジェネレーター、または SQL 断片に結びます。値は 変数 パネルにあります。実行時に Kerry がトークンを差し替え、解決済みの SQL をデータベースへ送ります。エディターのクエリはそのままです。
これはエンジン本体のバインドではありません。クライアント側の置換です。データベースが受け取る SQL には、すでに値が入っています。
変数の作り方
開いた workspace と SQL タブが必要です。
エディターから
- クエリに
:変数と書きます。例は:上限。 - スペースを押します。
- 名前の横の + をクリックします。
- 変数 パネルがその行で開きます。値と、テキスト以外なら型を入れます。
パネルから
- 変数 パネルを開きます。右サイドバーのアイコン、またはパレット(⌘K / CtrlK)→ 変数パネルを開く。
- 新しい変数 をクリックします。
- 識別子を
:なし で入れます。 - 型、スコープ(ローカル または グローバル)、編集している環境の値(デフォルト またはプロジェクトの環境)を選びます。
- 値を入れます。エディターでは
:変数を使います。
ローカル は 1 つの workspace で効きます。グローバル はすべてで効きます。
環境ごとに 1 つの値
変数の書き方は 2 つあります。
:変数、たとえば :上限 は、タブがいる環境の値を使います。パネルでその環境が空なら デフォルト が入ります。
:変数:環境、たとえば :上限:production は、タブが別の環境にいてもその環境の値を使います。: は名前と環境のあいだだけです。
Postgres ではコロン 2 つ続きはキャストです。:上限::text は「変数 上限 を text に変換」です。環境は選びません。本番なら :上限:production です。
パネルでは、1 行が 1 つの名前です。環境セレクターは別の変数を作りません。その行のどの値を編集しているかだけを切り替えます。
上限 がステージングで 50、本番で 500 なら:
| SQL の中 | タブの環境 | データベースが受け取るもの |
|---|---|---|
:上限 | ステージング | 50 |
:上限:production | ステージング | 500 |
SELECT id, total
FROM orders
WHERE total >= :上限
ORDER BY total DESC;パネルで値を変えても、クエリはそのままです。タブがステージングから本番へ移り、SQL が環境を固定していない :上限 なら、データベースは 50 ではなく 500 を受け取ります。
テキスト、数値、または SQL 断片
| 型 | データベースが受け取るもの |
|---|---|
| テキスト、数値、Boolean、Null | 対応するリテラル |
| SQL | クエリ内の断片(引用符なし) |
型 SQL は WHERE、JOIN、式を保管し、引用符なしでステートメントに入れます。複数のクエリが同じ有効行の条件を共有するなら:
:active_filter(SQL)= status = 'active'
SELECT *
FROM orders
WHERE :active_filter;$faker. でテストデータを作る
変数の値の $faker. は、実行のたびに新しい値を作ります。テスト用メールなら:
:test_email(テキスト)= $faker.internet.email
INSERT INTO customers (email)
VALUES (:test_email);$faker. は SQL に直接書いても動きます($faker.person.fullName)。変数に置けば、同じジェネレーターを使い回せます。SQL のコメントと文字列は変数として扱われません。