やってみる

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

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

 書出はできたが読込ができなかった……。C言語でやれと?

成果物

.help session

sqlite3 :memory: ".help session"
.session ?NAME? CMD ...  Create or control sessions
   Subcommands:
     attach TABLE             Attach TABLE
     changeset FILE           Write a changeset into FILE
     close                    Close one session
     enable ?BOOLEAN?         Set or query the enable bit
     filter GLOB...           Reject tables matching GLOBs
     indirect ?BOOLEAN?       Mark or query the indirect status
     isempty                  Query whether the session is empty
     list                     List currently open session names
     open DB NAME             Open a new session on DB
     patchset FILE            Write a patchset into FILE
   If ?NAME? is omitted, the first defined session is used.

公式ドキュメント

 ざっくり読んでまとめたら以下。

  • アタッチ: 変更の監視を開始する
  • チェンジセット: insert, update, deleteを含む
  • パッチセット: update, deleteを含む

 ただしC言語インタフェースでの説明しかない。ドットコマンドの説明は?

.session

 書込はできたが読込ができない。意味ないじゃん……。

changeset

sqlite3 :memory: \
".session open main session_0" \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".session changeset changeset_0"
cat changeset_0
TusersYamada

patchset

sqlite3 :memory: \
".session open main session_0" \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
"update users set name='YaMaDa';" \
".session changeset patchset_0"
cat patchset_0
TusersYaMaDa

読み込めない……

 作ったchangeset_0, patchset_0はどうやって適用するの?

 公式ドキュメントにはC言語での話しか書いてない……。

失敗ログ

.session open

sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
".session open main changeset_0" \
"select * from users;"





sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
".session open changeset_0 main" \
"select * from users;"





sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
".session session_0 open changeset_0" \
"select * from users;"

 ヘルプと同じ内容が出て失敗。

.restore

sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
".restore changeset_0" \
"select * from users;"
Error: file is not a database

.read

sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
".read changeset_0" \
"select * from users;"
Error: near line 1: near "T": syntax error

.import

sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
".import changeset_0 users" \
"select * from users;"
changeset_0:1: expected 2 columns but found 1 - filling the rest with NULL
changeset_0:1: INSERT failed: datatype mismatch

失敗ログ

 そもそもchangesetpatchsetの書き出し方もわからなかったので試行錯誤した。

失敗ログ

attach

すべてのテーブルを対象にしたかったが不可

失敗ログ

sqlite3 :memory: ".session attach"

 ヘルプと同じ内容が出て失敗する。以下も同じ。

sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".session attach"

 以下はエラー。

sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".session attach *"
ERROR: No sessions are open
sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".session attach NULL"
ERROR: No sessions are open
sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".nullvalue NULL" \
".session attach NULL"
ERROR: No sessions are open

テーブルを指定する

sqlite3 :memory: \
"create table users(id integer primary key, name text);" \
".session attach users" \
"insert into users(name) values('Yamada');" \
"insert into users(name) values('Suzuki');" \
"insert into users(name) values('Tanaka');" \
".session changeset changeset_0"
ERROR: No sessions are open
ERROR: No sessions are open
sqlite3 :memory: \
".session open :memory: :memory:" \
".session attach" \
"create table users(id integer primary key, name text);" \
sqlite3 :memory: \
".session open :memory: :memory:" \
".session attach NULL" \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".session changeset changeset_0"

 changeset_0ファイルが生成されたが空だった。

sqlite3 :memory: \
".session open :memory: :memory:" \
".session attach users" \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".session changeset changeset_0"

 changeset_0ファイルが生成されたが空だった。

sqlite3 :memory: \
".session open :memory: :memory:" \
"create table users(id integer primary key, name text);" \
".session attach users" \
"insert into users(name) values('Yamada');" \
".session changeset changeset_0"

 changeset_0ファイルが生成されたが空だった。

sqlite3 :memory: \
".session open main session_0" \
"create table users(id integer primary key, name text);" \
".session attach users" \
"insert into users(name) values('Yamada');" \
".session changeset changeset_0"

 なんか出た! バイナリデータっぽい。

sqlite3 :memory: \
".session open main session_0" \
".session attach users" \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".session changeset changeset_0"

 attachせずとも出た。いらないのかよ……。たぶん以下なのだろう。

  • attach: テーブル指定
  • open: セッション作成
sqlite3 :memory: \
".session open main session_0" \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
".session changeset changeset_0"
cat changeset_0
TusersYamada

 ついでにパッチセットも書き出してみる。これはdelete,updateのみ。

sqlite3 :memory: \
".session open main session_0" \
"create table users(id integer primary key, name text);" \
"insert into users(name) values('Yamada');" \
"update users set name='YaMaDa';" \
".session changeset patchset_0"
cat patchset_0
TusersYaMaDa

対象環境

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

前回まで