sqlite3 コマンドを実行したら “– Loading resources from ~/.sqliterc” というメッセージが表示され困った話

2022-10-12Bash,SQL,SQLite

sqlite3 コマンドを実行したら "-- Loading resources from ~/.sqliterc" というメッセージが表示され困った話

はじめに

最近、なぜだか急に SQLite 周りの話題で盛り上がり始めましたね。

過去にマーケティングの効果測定サービスの設計/開発/運用をしていたときには、ストレージ層(MySQL クラスタ)の冗長化の一環として、SQLite を各 Web サーバに定期的にばらまく、といったキャッシュ機構を導入したいた事がありました

その時のことを思い出して、懐かしさを感じています

今回は自分の作業用 PC で sqlite3 コマンドを実行したところ、 -- Loading resources from ~/.sqliterc というメッセージが出力されました。

こちらのメッセージが邪魔なのでなんとか除外したいなぁと悩んで対処したことをエントリにまとめてみました。

検証環境

$ uname -moi
arm64 unknown Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.1.16(1)-release (aarch64-apple-darwin21.1.0)

$ sqlite3 --version
3.37.0 2021-12-09 01:34:53 9ff244ce0739f8ee52a3e9671adb4ee54c83c640b02e3f9d185fd2f9a179aapl

問題

とある SQLite データベースファイル test.db があり、こちらにはテーブル t1 が含まれています。

$ sqlite3 ./test.db

Enter ".help" for usage hints.
sqlite> .schema t1
CREATE TABLE t1 (c1 int, c2 text);

t1 テーブルデータを全て閲覧したかったので、 sqlite3 コマンドの引数に SQL を指定し実行してみました。

$ sqlite3 ./test.db "select * from t1"
-- Loading resources from /Users/genzouw/.sqliterc
c1  c2
--  -----
1   hello
2   world

レコードが 2 件挿入されているのがわかったのですが、出力結果の 1 行目のメッセージが気になりました。

-- Loading resources from /Users/genzouw/.sqliterc

/Users/genzouw/.sqliterc というファイルは以前自分で用意したファイルです。
sqlite3 コマンド実行時の挙動を変更するための設定ファイルになります。

# ファイルの中身を確認
$ cat ~/.sqliterc
.header on
.mode column

設定は 2 行記述してあります。

  • .header on で出力結果にヘッダー行が追加されます。
  • .mode column で出力列の区切り文字がデフォルトの | から タブ区切りとなります。

-- Loading resources from /Users/genzouw/.sqliterc という文言があると、 SQL 実行結果をパイプで後続に渡すといったことをしたい場合に面倒が起きそうで、なんとかこれが表示されないようにしようと思いました。

対処法 1 : ~/.sqliterc を削除 OR 移動

~/.sqliterc ファイルがあることで不要なメッセージが出力されてしまうので、このファイルを一時的に削除または移動すればメッセージが表示されないようになります。

$ sqlite3 ./test.db "select * from t1"
-- Loading resources from /Users/genzouw/.sqliterc
c1  c2
--  -----
1   hello
2   world

# 一時的に移動
$ mv ~/.sqliterc /tmp

$ sqlite3 ./test.db "select * from t1"
1|hello
2|world

メッセージは表示されないようになりました。
しかし、出力フォーマットも変わってしまい、また出力後にまた .sqliterc ファイルをもとに戻す作業が必要になります。

対処法 2 : インタラクティブな操作をやめる( 標準入力を塞ぐ )

SQLite のコードを見てみます。

以下の 2 つの条件を満たした状態で sqlite3 コマンドが起動すると、このメッセージが表示されるようです。

  1. ~/.sqliterc ファイルが存在
  2. インタラクティブな標準入力を保持

先程紹介した 「 ~/.sqliterc ファイルの削除または移動」は 1 つ目の条件を無効化する対処です。
対処法 2 では、 インタラクティブな標準入力を無効化する対処になります。

以下のいずれかで対処できます。

# /dev/null を標準入力に流す
$ sqlite3 ./test.db "select * from t1" </dev/null
c1  c2
--  -----
1   hello
2   world

# </dev/null はどこに記述してもよい
$ </dev/null sqlite3 ./test.db "select * from t1"
c1  c2
--  -----
1   hello
2   world

# sqlite3 には バッチモードで実行 というオプションが有る
$ sqlite3 --batch ./test.db "select * from t1"
c1  c2
--  -----
1   hello
2   world

対処法 3 : SQL を標準入力で渡す

対処法 2 に似ています。SQL を標準入力経由で渡します。
インタラクティブな標準入力を 閉じる という考えでは、対処法 2 と一緒かもしれません。

# <<< で渡してもいいし
$ sqlite3 ./test.db <<<"select * from t1"
c1  c2
--  -----
1   hello
2   world

# パイプ経由で渡してもいい
$ echo "select * from t1" | sqlite3 ./test.db
c1  c2
--  -----
1   hello
2   world

# ヒアドキュメントも使える
$ cat <<EOF | sqlite3 ./test.db
select * from t1
EOF
c1  c2
--  -----
1   hello
2   world

対処法 4 : 気にしないようにする

いっそ、無視してしまいましょう。

というのも、この -- Loading resources from /Users/genzouw/.sqliterc というメッセージは標準出力ではなく 標準エラー出力 に出力されているメッセージだからです。

sqlite3 コマンドの実行結果をパイプで次の処理に渡したとしても、 -- Loading resources from /Users/genzouw/.sqliterc のメッセージはパイプで渡りません。

sqlite3 コマンドの実行結果をリダイレクトでファイルに書き出した場合も同様で、 このメッセージは書き込まれません。

# > output.txt でファイルに書き込んでも、メッセージはコンソールに表示される
$ sqlite3 ./test.db "select * from t1" > output.txt
-- Loading resources from /Users/genzouw/.sqliterc

# ファイルの中身にはメッセージは含まれていない
$ cat output.txt
c1  c2
--  -----
1   hello
2   world

ひとこと

sqlite3 コマンドに対して SQL を指定する際には、標準入力で渡してやるのが素直そうです。

2022-10-12Bash,SQL,SQLite