やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3ドットコマンド(.changes)

 直前のSQLで変更された行数を表示する。

成果物

.help

.changes on|off          Show number of rows changed by SQL

CLI

 on,offによる違いなし。

sqlite3 :memory: \
".changes on" \
"create table T(C text);" \
"insert into T values('A');" \
"insert into T values('A');" \
"update T set C='B' where C='A';" \
"select changes();"
2
sqlite3 :memory: \
".changes off" \
"create table T(C text);" \
"insert into T values('A');" \
"insert into T values('A');" \
"update T set C='B' where C='A';" \
"select changes();"
2

 ちなみに以下はエラー。

sqlite3 :memory: \
".changes on" \
"create table T(C text);" \
"insert into T values('A');" \
"insert into T values('A');" \
"update T set C='B' where C='A';" \
".changes"
Usage: .changes on|off
sqlite3 :memory: \
".changes on" \
"create table T(C text);" \
"insert into T values('A');" \
"insert into T values('A');" \
"update T set C='B' where C='A';" \
"changes()"
Error: near "changes": syntax error

SQLファイル作成版

echo "create table T(C text);
insert into T values('A');
insert into T values('A');
update T set C='B' where C='A';
select changes();" > 0.sql
# SQLファイル実行
for path in `ls -1 | grep .sql$ | sort`; do
    echo $path
    sqlite3 :memory: < $path
done

バッチシェル実行

run_sql.sh

SCRIPT_DIR=$(cd $(dirname $0); pwd)
cd "$SCRIPT_DIR"

# SQLファイル作成
echo "create table T(C text);
insert into T values('A');
insert into T values('A');
update T set C='B' where C='A';
select changes();" > 0.sql

echo "loop-----"
# SQLファイル実行
for path in `ls -1 | grep .sql$ | sort`; do
    echo $path
    sqlite3 < $path
done

echo ".changes デフォルト-----"
sqlite3 :memory: ".read 0.sql"
echo ".changes on-----"
sqlite3 :memory: ".changes on" ".read 0.sql"
echo ".changes off-----"
sqlite3 :memory: ".changes off" ".read 0.sql"
loop-----
0.sql
2
.changes デフォルト-----
2
.changes on-----
changes:   0   total_changes: 0
changes:   1   total_changes: 1
changes:   1   total_changes: 2
changes:   2   total_changes: 4
2
changes:   2   total_changes: 4
.changes off-----
2

 以下のような行が表示された。これが.changes onの効果らしい。

changes:   0   total_changes: 0
  • なぜCLIコマンド版のときは表示されなかったのだろう……。謎
  • 2だけの行はchanges()関数の戻り値と思われる。この関数と.changes onの出力は別物のようだ
  • デフォルトはoffだとわかった

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで