2022年3月26日土曜日

SQLite3 コマンドラインツールの接続を切り替える (.connection)

概要

SQLite3のコマンドラインツール上で複数のデータベースとの接続を維持するには .connectionコマンドを使用する。

似たような処理に「 attach/detach 」があるが、「attach/detach」が一つの接続で 複数のデータベースを扱えるようにするSQLであるのに対し、 .connectionは複数の接続を作成するコマンド。

これによって、いちいちコマンドラインツールを終了しなくても 他のデータベースファイルを開くことが可能になった。(最大10接続まで)

.connectionで別々に作られた接続は完全に独立しており、 コマンドラインツール上でデータのやり取りをすることは出来ない。

「.mode」や「 .output 」といったコマンドは接続ごとではなく コマンドラインツールに設定されるためどの接続でも共通。

操作できるのは起動しているコマンドラインツール内の接続のみ。
他のコマンドラインツールやプログラムが同じデータべファイルにアクセスしているかを 確認出来るわけではない。

構文

.connectionコマンドは ver 3.37.0 から利用可能。

現在の接続を確認する


.connection
.conn
                

新しい接続を作る/番号を指定して接続を切り替える


.connection ?connection_number?
.conn ?connection_number?
                

接続を切る
ただしアクティブな接続を切ることは出来ない。


.connection close ?connection_number?
.conn close ?connection_number?
                

実行例

環境
  • Windows 10 64bit
  • SQLite Command-Line Shell ver 3.38.0
複数の接続を作成する・切断する
  1. sample.dbに接続する
  2. 現在の接続を確認する。
    sample.dbへの接続がアクティブであることが確認できる。
  3. sample.dbには「test」という名前のテーブルがあることが確認できる。
  4. 1番を指定して新しい接続を作成する。
  5. インメモリデータベースへの接続が新しく作成され、 アクティブになっていることが確認できる。
  6. 新しいインメモリデータベースなのでテーブルは登録されておらず、 sample.db のテーブルも見ることはできない。
  7. 新しい接続でデータベースファイルを開くには.openコマンドを使う。
  8. 番号を指定して接続を切り替える。(元に戻す)
  9. 元のsample.dbの接続を切る。

C:\temp>sqlite3 sample.db
SQLite version 3.38.0 2022-02-22 18:58:40
Enter ".help" for usage hints.

sqlite> -- 1.
sqlite> .connection
ACTIVE 0: sample.db

sqlite> .tables
test

sqlite> -- 2.
sqlite> .connection 1
sqlite> .connection
       0: sample.db
ACTIVE 1: (memory)

sqlite> -- 3.
sqlite> .tables

sqlite> select * from test;
Parse error: no such table: test

sqlite> -- 4.
sqlite> .open sample2.db
sqlite> .connection
       0: sample.db
ACTIVE 1: sample2.db

sqlite> -- 5.
sqlite> .connection 0
sqlite> .connection
ACTIVE 0: sample.db
       1: sample2.db

sqlite> -- 6.
sqlite> .connection close 1
sqlite> .connection
ACTIVE 0: sample.db
                    
「.mode」などのコマンド設定はどの接続でも共通
  1. 接続1に切り替えて出力モードを「box」に変更
  2. 接続0に戻しても「box」モードで出力されることが確認できる

sqlite> .connection
ACTIVE 0: ./sample.db
       1: ./sample2.db
sqlite> select * from test;
1|test01

sqlite> -- 1.
sqlite> .connection 1
sqlite> .mode box

sqlite> -- 2.
sqlite> .connection 0
sqlite> select * from test;
┌────┬────────┐
│ id │  name  │
├────┼────────┤
│ 1  │ test01 │
└────┴────────┘
                    

参考URL