sqlite3コマンドを実行したら”– Loading resources from ~/.sqliterc”というメッセージが表示され困った話
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
コマンドが起動すると、このメッセージが表示されるようです。
~/.sqliterc
ファイルが存在- インタラクティブな標準入力を保持
先程紹介した 「 ~/.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 を指定する際には、標準入力で渡してやるのが素直そうです。
ディスカッション
コメント一覧
まだ、コメントがありません