2021年1月11日月曜日

SQLite 3 コマンドラインツールにも終了コードはある

概要

SQLite コマンドラインツールも終了したときに終了コードを出力するので コマンドプロンプトの「%ERRORLEVEL%」やBashの「$?」で確認することができる。 (ちなみに、コマンドプロンプトは「エラーレベル」、Bashは「終了ステータス」など呼び方はいろいろあるらしい。)

コマンドプロンプトの場合

                    
C:\temp>sqlite3 sample.db
SQLite version 3.34.0 2020-12-01 16:14:00
Enter ".help" for usage hints.

sqlite> create table product (id, name, quantity);
sqlite> insert into product values (1, 'potato', 100);
sqlite> .exit

C:\temp>echo %ERRORLEVEL%
0
                    
                

Bash(MacOSX)の場合


Mac-Air:~ user$ sqlite3
SQLite version 3.19.3 2017-06-27 16:48:08
Enter ".help" for usage hints.

sqlite> create table product (id, name, quantity);
sqlite> insert into product values (1, 'potato', 100);
sqlite> .exit

Mac-Air:~ user$ echo $?
0
                

終了コードの意味

コマンドラインツールでエラーが一つも発生しなければ 0、エラーが発生したら0以外になると覚えておけばいい。
(公式サイトを探してみたが、コマンドラインツールの終了コードに関する情報は見つからなかった。多分この認識で大丈夫なはず・・・)


C:\temp>sqlite3 sample.db
SQLite version 3.34.0 2020-12-01 16:14:00
Enter ".help" for usage hints.

sqlite> select * from not_exist_table;
Error: no such table: not_exist_table
sqlite> .exit

C:\temp>echo %ERRORLEVEL%
1
                

バッチファイルでの利用例

終了コードを使えば、バッチファイルやシェルスクリプトにコマンドラインツールを組み込んだ時、 エラー処理ができる

以下はsample.dbというデータベースにCSVファイルを取り込むバッチ処理の例。 CSVの取り込みに失敗したら「Error」を表示する。

import.sql

.mode csv
.import data.csv temp_table
.quit
                
sample.bat

sqlite3 sample.db < import.sql
if not %ERRORLEVEL% == 0 (
    echo Error
)
echo Success
exit
                

「.exit」コマンドを使うことで終了コードを指定することができる。

SQLiteコマンドラインツールを終了させるには「.quit」もしくは「.exit」コマンドを使うが、 「.exit」コマンドの引数に数値を渡すと終了コードを指定できる。 「.quit」コマンドでは指定できない。


C:\temp>sqlite3 sample.db
SQLite version 3.34.0 2020-12-01 16:14:00
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .exit 999

C:\temp>echo %ERRORLEVEL%
999
                

参考URL