2025年12月21日日曜日

SQLite3 エラーが起きた時に処理をキャンセルする (.bail)

概要

SQLite3のコマンドラインツールを使用している際、 一連の処理でエラーになった場合、 .bailコマンドを設定しておくことで その後の処理をキャンすることができる。

SQLiteコマンドラインツールを起動する際に -bailオプションを指定することでも 同様の効果を得ることができる。

これにより、連鎖的にエラーが発生したり、意味のない処理が動くことを止めることができる。

構文

コマンドラインツール起動中にBail機能をON/OFF にする。(デフォルトはOFF)


.bail on
.bail off
                

コマンドライン起動時にBail機能をON/OFF にする。(デフォルトはOFF)


c:\temp> sqlite3 -bail on
c:\temp> sqlite3 -bail off
                

実行例

環境
  • Windows 10 64bit
  • SQLite Command-Line Shell ver 3.50.2

.bailはCLIでコマンドを手入力する作業ではあまり恩恵がない。(と思う)
外部のSQLファイルを読み込んだり、シェルのコマンドラインからSQLを渡したときに効果を発揮する。

.bailがOFFのままの場合

以下のようなSQLファイルを準備する。

sample_01.sql

-- # 1
.bail off

-- # 2
create table user_01 (id, name);
create tbl user_02 (id, name);
create table user_03 (id, name);
                    
  1. bailをOFFにする
  2. create table文を3つ実行する。
    ただし、2つ目のSQL構文に誤りがあるのでエラーになるようになっている。

準備したSQLファイルをSQLite3のコマンドラインツールから読み込んで テーブル一覧を表示してみる。


.read ./sample_01.sql
.tables
                    

実行結果


sqlite> .read ./sample.sql
Parse error near line 6: near "tbl": syntax error
  create tbl user_02 (id, name);
         ^--- error here
sqlite> .tables
user_01  user_03
                    

2つ目のSQLが失敗し、エラーになっている。 1つ目のSQLと3つ目のSQLは成功し、 テーブルが2つ作成されていることがわかる。

.bailをONにした場合

以下のようなSQLファイルを準備する。

sample_02.sql

-- # 1
.bail on

-- # 2
create table user_01 (id, name);
create tbl user_02 (id, name);
create table user_03 (id, name);
                    
  1. bailをONにする
  2. create table文を3つ実行する。
    2つ目のSQL構文に誤りがあるのでエラーになるようになっている。
  3. テーブル一覧を表示する

準備したSQLファイルをSQLite3のコマンドラインツールから読み込む。


.read ./sample_02.sql
.tables
                    

実行結果


sqlite> .read ./sample02.sql
Parse error near line 6: near "tbl": syntax error
  create tbl user_02 (id, name);
         ^--- error here
sqlite> .tables
user_01
                    

2つ目のSQLが失敗し、.tablesを実行すると、 user_03テーブルが作成されていないことがわかる。

よって2つ目でSQLが失敗した後、以降のSQLやコマンドはキャンセルされていることがわかる。

コマンドラインツールで手で入力する場合

以下のような実行の仕方では bailは意味がない。


sqlite> .bail on
sqlite> create table user_01 (id, name);
sqlite> create tbl user_02 (id, name);
Parse error: near "tbl": syntax error
  create tbl user_02 (id, name);
         ^--- error here
sqlite> create table user_03 (id, name);
sqlite> .tables
user_01  user_03
                    

以下のように一度に複数のSQLを実行する場合であれば、 途中で発生したエラー以降はキャンセルされる。


sqlite> .bail on
sqlite> create table user_01 (id, name); create tbl user_02 (id, name); create table user_03 (id, name);
Parse error: near "tbl": syntax error
  create tbl user_02 (id, name); create table user_03 (id, name);
         ^--- error here
sqlite> .tables
user_01
                    

参考URL