DB接続。
成果物
情報源
attach
attach database 接続文字列 as スキーマ名
detach database スキーマ名
database
キーワードを省略することもできる。
attach 接続文字列 as スキーマ名
detach スキーマ名
接続文字列
- シングルクォート
''
で囲む ':memory:'
でインメモリを指定可'ファイルパス'
で指定DBファイルに接続'file:...'
のようにURIファイル名を指定可
要素の操作
操作/要素 | スキーマ | テーブル |
---|---|---|
一覧 | .databases |
.tables , .schema select * from スキーマ名.sqlite_master; |
指定 | attach '接続文字列' as 'スキーマ名;' detach スキーマ名; |
select * from スキーマ名.テーブル名; |
特殊スキーマ名
特殊スキーマ名 | 概要 |
---|---|
main |
sqlite3 コマンドなどでオープンしたDB |
temp |
create temp table ... などで作成された一時DB |
DBオープンしたらそのDBは 一時テーブルを作るとそれは 指定DBを接続する。指定スキーマ名で。 以下のように怒られる。確認
main
スキーマ名である。.database
:main
temp
スキーマ名配下に作成される。create temp table T(A int);
.database
:main
:temp
attach ':memory:' as mem0;
.database
:main
:mem0
main
,temp
,attach
で各スキーマができる。attach ':memory:' as mem0;
create temp table T(A int);
.database
:main
:temp
:mem0
main
,temp
スキーマは削除できない。attach ':memory:' as mem0;
create temp table T(A int);
detach main;
detach temp;
detach mem0;
.databases
main:
temp:
cannot detach database main
cannot detach database temp
main
スキーマ名
create table T(A int); select sql from sqlite_master; select sql from main.sqlite_master; insert into T values(0); insert into main.T values(1); select * from T;
create table
文でスキーマ名を省略したらmain
になるmain
以外でcreate
したいならスキーマ名を指定する- ただし後述の
temp
は別
- ただし後述の
select
でスキーマ名を省略したら各スキーマに存在するテーブルになる
temp
スキーマ名
create temp table T(A int); select sql from temp.sqlite_master; select sql from temp.sqlite_temp_master; insert into temp.T values(0); select * from temp.T;
- 一時テーブル作成:
create temp table
かcreate temporary table
文で- テーブル名の前にスキーマ名を指定できない
temporary table name must be unqualified
エラー
- テーブル名の前にスキーマ名を指定できない
create temp table main.T(A int); attach ':memory:' as mem; create temp table mem.T(A int);
temporary table name must be unqualified
任意スキーマ名(attach
)
attach ':memory:' as mem0; create table mem0.T(A int); select sql from mem0.sqlite_master; insert into mem0.T values(0); select * from mem0.T;
create table a.T(A int);
Error: unknown database a
テーブル結合
異なるスキーマ間におけるテーブル結合。
attach ':memory:' as mem; create table T(A int); create temp table T(A int); create table mem.T(A int); insert into main.T values(0); insert into temp.T values(0); insert into mem.T values(0); .echo on select * from main.T left join temp.T on main.T.A = temp.T.A; select * from main.T left join mem.T on main.T.A = mem.T.A; select * from temp.T left join mem.T on temp.T.A = mem.T.A; .echo off
スキーマ名の省略
attach ':memory:' as mem; create table T(A int); create temp table U(A int); create table mem.V(A int); insert into T values(0); insert into U values(0); insert into V values(0); .echo on select * from T left join U on T.A = U.A; select * from T left join V on T.A = V.A; select * from U left join V on U.A = V.A; .echo off
メモリ→ファイル
- データ編集は主にメモリ側で行う
- 一区切りついたらファイルへ保存する
これによりディスクI/Oが減って応答速度の向上や寿命が伸びる。
attach ':memory:' as m; attach './a.db' as f; create table m.users(id integer primary key, name text not null); create table f.users(id integer primary key, name text not null); insert into m.users(name) values('Yamada'); begin transaction; insert into f.users(name) select name from m.users; delete from m.users; commit; insert into m.users(name) values('Suzuki'); insert into m.users(name) values('Tanaka'); begin transaction; insert into f.users(name) select name from m.users; delete from m.users; commit; .echo on select * from f.users; select * from m.users; .echo off
さらなる要件として、追加・更新・削除したレコードを把握したい。修正内容やその経緯も。
これらを実装するならリビジョン管理用テーブルなどを作って差分を残しておく必要がある。削除も変更ログとして残すことになる。それにより復元できるようになる。完全にディスクから削除するには別の操作をさせるようにする。
コードにするまで大変そうなので今回は見送る。
参考
- https://stackoverflow.com/questions/82875/how-to-list-the-tables-in-a-sqlite-database-file-that-was-opened-with-attach
- https://stackoverflow.com/questions/2127138/how-to-retrieve-the-last-autoincremented-id-from-a-sqlite-table
- https://note.kiriukun.com/entry/20181223-working-with-sqlite-sequence
対象環境
- 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学習 環境構築まとめ
- SQLite3学習 インタフェースまとめ(C言語、CLI、対話モード、Tcl...)
- SQLite3学習 ドットコマンドまとめ
- SQLite3学習 JSON拡張まとめ
- SQLite3学習 FTSまとめ(ICU, MeCab)
- SQLite3学習 再帰クエリ(WITH RECURSIVE)
- SQLite3学習 R-Treeモジュール
- SQLite3学習 Geopoly(2次元ベクタ画像の生成)
- SQLite3学習 拡張関数(generate_series)
- SQLite3学習 拡張ライブラリ数学関数(extension-functions.c)
- SQLite3学習 謎と名前
- SQL構文 alter(rename)
- SQL構文 alter(add column)概要
- SQL構文 alter(add column)制約
- SQL構文 alter(add column)sqlite_master変更しても反映されない
- SQL構文 alter(add column)スキーマ再定義(テーブル再作成による定義変更)
- SQL構文 analyze