\eでクエリバッファを外部エディタで編集する

psqlの\eメタコマンドは、現在のクエリバッファの内容を一時ファイルへ書き出し、環境変数EDITORに指定したエディタで開く。エディタを閉じると、編集後の内容がそのままクエリバッファとして実行される。

testdb=# SELECT id, name FROM users WHERE id = 1
testdb-# \e

エディタが起動し、以下の内容が表示される。

SELECT id, name FROM users WHERE id = 1

長いクエリを複数行にわたって整形したい場合や、psqlの入力行編集だけでは修正しづらい複雑な変更をしたい場合に使う。エディタを保存して終了すると、編集後の内容がそのまま実行される。

環境変数はPSQL_EDITOREDITORVISUALの順に優先され、いずれも未設定の場合はOSごとのデフォルトエディタ(Unix系ではviなど)が使われる。

\eにファイル名を指定してファイルを編集する

\eにファイル名を指定すると、クエリバッファの代わりにそのファイルをエディタで開く。SQLスクリプトをその場で編集してすぐに実行したい場合に使う。

testdb=# \e /path/to/script.sql

ファイルの内容を保存して終了すると、その内容がそのままクエリバッファとして実行される。

\sf/\svで関数・ビューの定義を表示する

\sfは関数の定義を、\svはビューの定義をCREATE OR REPLACE文の形式で表示する。実行はせず、表示するだけである。

testdb=# \sf total_orders
CREATE OR REPLACE FUNCTION public.total_orders(uid integer)
 RETURNS numeric
 LANGUAGE sql
AS $function$ SELECT coalesce(sum(amount),0) FROM public.orders WHERE user_id = uid; $function$

testdb=# \sv user_orders
CREATE OR REPLACE VIEW public.user_orders AS
 SELECT u.name,
    o.amount
   FROM users u
     JOIN orders o ON u.id = o.user_id

+を付けると本体部分に行番号が付く。

testdb=# \sf+ total_orders
        CREATE OR REPLACE FUNCTION public.total_orders(uid integer)
         RETURNS numeric
         LANGUAGE sql
1       AS $function$ SELECT coalesce(sum(amount),0) FROM public.orders WHERE user_id = uid; $function$

行番号は関数本体(AS $$ ... $$の中身)にだけ付き、シグネチャ部分には付かない。次に説明する\efで特定の行から編集したい場合に、この行番号を指定に使う。

\ef/\evで関数・ビューの定義を直接編集する

\efは関数の定義を、\evはビューの定義を取得してエディタで開く。保存して終了すると、編集後の内容がそのままCREATE OR REPLACE文として実行される。

testdb=# \ef total_orders

エディタには\sfと同じ内容が表示される。関数本体を書き換えて保存すると、その場でCREATE OR REPLACE FUNCTIONが実行される。

CREATE FUNCTION

わざわざCREATE OR REPLACE FUNCTION文を手で組み立て直さなくても、既存の定義を土台に修正できる。関数名の後ろに行番号を指定すると、その行にカーソルを合わせた状態でエディタが開く。

testdb=# \ef total_orders 1

対応する\ev ビュー名 [行番号]もビューに対して同様に動作する。

具体例: 複雑な関数をその場で修正する

デバッグ中に気づいたバグをすぐ修正して試したい場合、\efを使うとエディタの往復だけで完結する。

testdb=# \ef total_orders

エディタでWHERE user_id = uidの条件を修正し、保存する。

CREATE OR REPLACE FUNCTION public.total_orders(uid integer)
 RETURNS numeric
 LANGUAGE sql
AS $function$
  SELECT coalesce(sum(amount), 0)
  FROM orders
  WHERE user_id = uid AND amount > 0
$function$

保存して終了するとCREATE OR REPLACE FUNCTIONが実行され、修正後の定義がすぐに反映される。修正後は\sfで意図した内容になっているか確認する。

testdb=# \sf total_orders

参考