Liquidsのロゴ Liquids

0

PostgreSQLで複数のSQLファイルを1つのトランザクションで実行する

PostgreSQL

psqlコマンドを実行する際に--single-transactionオプションまたは-1オプションを指定します。

PostgreSQLでSQLファイルを実行するにはpsqlを次のように使用します。

psql -f <ファイル名>

この時、複数のSQLファイルを連続して実行したいとします。

psql -f <ファイル名1> -f <ファイル名2>

ただし、SQLファイルは以下を想定します。2つ目のSQLファイルにはvalues -> valesと構文ミスがあります。

insert into sample_table (id, amount, price) values (4, 20, 30);
insert into sample_table (id, amount, price) values (5, 400, 6);
insert into sample_table (id, amount, price) vales (6, 500, 3);

これらを連続で実行すると、このようなフィードバックが得られます。

INSERT 0 1
INSERT 0 1
psql:<ファイル名2>:1: ERROR:  syntax error at or near "vales"
行 1: insert into sample_table (id, amount, price) vales (6, 500, ...

対象テーブルをSELECTすると、1つ目のSQLファイルの実行はCOMMITされて、テーブルに反映されてしまっています。

 id | amount | price 
----+--------+-------
  1 |     10 |   200
  2 |      3 |  1000
  3 |      5 |   500
  4 |     20 |    30
  5 |    400 |     6
(5 行)

1つ目、2つ目のSQLファイルを1つのトランザクションとして実行することが望まれる場合には、--single-transactionオプションまたは-1オプションを指定します。

psql --single-transaction -f <ファイル名1> -f <ファイル名2>

--single-transactionを指定して、先ほどと同様に2つのSQLファイルを連続で実行します。その後のテーブル内容を取得しみると、1つ目のSQLファイルの内容は反映されずにロールバックされていることがわかります。

 id | amount | price 
----+--------+-------
  1 |     10 |   200
  2 |      3 |  1000
  3 |      5 |   500
(3 行)

Liquidsのロゴ Liquids

Liquidsは誰でも投稿・編集ができる技術Wikiコミュニティ📝です。

あなたもLiquidsで技術Wikiを
書いてみませんか?