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
はどうやって適用するの?
失敗ログ
☓ .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
失敗ログ
そもそもchangeset
やpatchset
の書き出し方もわからなかったので試行錯誤した。
失敗ログ
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
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- SQLite 3.29.0
- MeCab 0.996ユーザ辞書
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
前回まで
- SQLite3学習をはじめよう
- SQLite3学習 SQLiteについて
- SQLite3学習 SQLiteの適切な用途
- SQLite3学習 SQLiteの特徴
- SQLite3学習 SQLiteのクセ
- SQLite3学習 データ型とアフィニティ
- SQLite3学習 演算子の一覧
- SQLite3学習 よくある質問
- SQLite3学習 SQLiteダウンロード&コンパイル
- SQLite3学習 Tclで操作する
- SQLite3学習 ビルドオプション動作確認(SQLITE_ALLOW_URI_AUTHORITY)
- SQLite3学習 面白そうなコンパイルオプション
- SQLite3学習 SQLiteの拡張について
- SQLite3学習 JSON拡張
- SQLite3学習 JSON拡張(json_extract)
- SQLite3学習 JSON拡張(json_each)
- SQLite3学習 JSON拡張(json_tree オブジェクト→行)
- SQLite3学習 JSON拡張(json_tree オブジェクトツリー→行)
- SQLite3学習 JSON拡張(json_tree オブジェクト配列→行)
- SQLite3学習 JSON拡張(json_group_array 行→配列)
- SQLite3学習 JSON拡張(json_group_object 行→オブジェクト)
- SQLite3学習 JSON拡張(json_array_length)
- SQLite3学習 JSON拡張(json_type)
- SQLite3学習 JSON拡張(json_valid)
- SQLite3学習 JSON拡張(json_quote)
- SQLite3学習 JSON拡張(json_array)
- SQLite3学習 JSON拡張(json_object)
- SQLite3学習 JSON拡張(json_patch)
- SQLite3学習 JSON拡張(json_insert)
- SQLite3学習 JSON拡張(json_replace)
- SQLite3学習 JSON拡張(json_set)
- SQLite3学習 JSON拡張(json_remove)
- SQLite3学習 全文検索(FTS5)
- SQLite3学習 全文検索FTSを日本語で使う方法を調べてみた
- 形態素解析MeCabをインストールする
- SQLite3学習 全文検索FTS5のMeCab用トークナイザを実装する
- SQLite3学習 FTS5+MeCabでクエリ構文
- SQLite3学習 FTS5のテーブル作成と初期化
- SQLite3学習 FTS5の補助関数
- SQLite3学習 FTS5のfts5vocab仮想テーブル
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 ファイル入出力(SQL集計)
- SQLite3学習 拡張関数(generate_series)
- SQLite3謎 主キーの型をintにするとinsertで値を省略したらNULLになってしまう
- SQLite3学習 入出力関数(fsdir, readfile, writefile, edit)
- SQLite3ビルド コンパイルオプションを付与する方法(CFLAGS等))
- SQLite3 コンパイルオプション確認方法(pragma compile_options)
- SQLite3ビルド ICUを有効にする(SQLITE_ENABLE_ICU)
- SQLite3拡張 ICUを動的ロードする
- SQLite3拡張 ICUでcollateする
- SQLite3拡張 ICUで全文検索する(FTS4)
- SQLite3拡張 SQL関数一覧(pragma function_list)
- SQLite3拡張 仮想テーブルモジュール一覧(pragma module_list)
- SQLite3拡張 プラグマ一覧(pragma pragma_list)
- SQLite3謎 values()構文
- SQLite3学習 インタフェース概要
- SQLite3学習 CLI起動引数(-A)Archive
- SQLite3ビルド SQLITE_HAVE_ZLIBコンパイルオプション付与するも確認できず
- SQLite3学習 CLI(-readonly)
- MeCabユーザ辞書の作り方(Wikipediaの題名を名詞とした)
- SQLite3学習 CLI(-zip)
- SQLite3ドットコマンド(.archive)
- SQLite3ドットコマンド(.auth)断念
- SQLite3ドットコマンド(.backup .restore)
- SQLite3ドットコマンド(.read)
- SQLite3ドットコマンド(.dump)
- SQLite3ドットコマンド(.bail)謎
- SQLite3ドットコマンド(.binary)
- SQLite3ドットコマンド(.cd)
- SQLite3ドットコマンド(.changes)
- SQLite3ドットコマンド(.testcase .check)
- SQLite3ドットコマンド(.clone)
- SQLite3ドットコマンド(.databases)
- SQLite3ドットコマンド(.dbconfig)
- SQLite3ドットコマンド(.dbinfo)
- SQLite3ドットコマンド(.echo)
- SQLite3ドットコマンド(.eqp)
- SQLite3ドットコマンド(.excel)
- SQLite3ドットコマンド(.exit)
- SQLite3ドットコマンド(.expert)
- SQLite3ドットコマンド(.filectrl)
- SQLite3ドットコマンド(.fullschema)
- SQLite3ドットコマンド(.headers)
- SQLite3ドットコマンド(.help)
- SQLite3ドットコマンド(.import)
- SQLite3ドットコマンド(.imposter)
- SQLite3ドットコマンド(.indexes)
- SQLite3ドットコマンド(.limit)
- SQLite3ドットコマンド(.lint)
- SQLite3ドットコマンド(.load)
- SQLite3ドットコマンド(.log)
- SQLite3ドットコマンド(.mode)
- SQLite3ドットコマンド(.nullvalue)
- SQLite3ドットコマンド(.once)
- SQLite3ドットコマンド(.open)
- SQLite3ドットコマンド(.output)
- SQLite3ドットコマンド(.parameter)
- SQLite3ドットコマンド(.print)
- SQLite3ドットコマンド(.progress)
- SQLite3ドットコマンド(.prompt)
- SQLite3ドットコマンド(.quit)
- SQLite3ドットコマンド(.read)
- SQLite3ドットコマンド(.read)
- SQLite3ドットコマンド(.recover)
- SQLite3ドットコマンド(.save)
- SQLite3ドットコマンド(.scanstats)
- SQLite3ドットコマンド(.schema)
- SQLite3ドットコマンド(.selftest)
- SQLite3ドットコマンド(.separator)