やってみる

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

SQLite3構文 virtual table(create/drop)

 仮想テーブルの作成。

成果物

情報源

仮想テーブルとは

 仮想テーブルとは、テーブルであるように見えるが、実際にデータベースファイルに情報を格納しない外部記憶装置又は計算エンジンへのインターフェースである。

仮想テーブル用モジュール

 仮想テーブルにはC言語で実装されたモジュールが必要。モジュール一覧は以下で取得できる。ただしSQLITE_INTROSPECTION_PRAGMASコンパイルオプション必須。また、モジュールを有効化するには各コンパイルオプションなどが必要なこともある。たとえば、こちらのとおりにビルドすれば以下のような結果になる。

PRAGMA module_list;
zipfile
completion
fsdir
sqlite_stmt
json_tree
json_each
sqlite_dbpage
sqlite_dbdata
fts5vocab
fts3
fts4
sqlite_dbptr
fts3tokenize
dbstat
fts5
rtree
rtree_i32
fts4aux
geopoly

仮想テーブルの制限

 基本的にはテーブルと同じように操作できる。ただし以下はできない。

  • 作成できない
    • インデックス
    • トリガー
  • ほとんどの仮想テーブルは読取専用

仮想テーブルの削除

  • drop tableで行う。drop virtual table文は無い

構文

create virtual table テーブル名 using モジュール名

 FTS5を使う。以下の環境構築を終えていること。

.load /home/pi/root/sys/env/tool/sqlite_ext/fts5_mecab
create virtual table posts using fts5(title, body, tokenize = 'mecab');
insert into posts values('記事のタイトル', '記事の本文。');
insert into posts values('SQLite3 VirtualTable', '仮想テーブルについての記事。');
select * from posts where posts match 'SQLite3';
SQLite3 VirtualTable|仮想テーブルについての記事。

 sqlite_master表にも追加されている。

.headers on
select * from sqlite_master where sql like 'CREATE VIRTUAL TABLE %';
type|name|tbl_name|rootpage|sql
table|posts|posts|0|CREATE VIRTUAL TABLE posts using fts5(title, body, tokenize = 'mecab')

 typetableなので、テーブルと区別がつかない。そこでsqlそのままを絞込条件にした。

create virtual table if not exists テーブル名 using モジュール名

 既存の仮想テーブル名をcreateしようとすると、以下エラーになる。

Error: table テーブル名 already exists

 これを抑制するにはif not existsを使う。

.load /home/pi/root/sys/env/tool/sqlite_ext/fts5_mecab
create virtual table posts using fts5(title, body, tokenize = 'mecab');
create virtual table if not exists posts using fts5(title, body, tokenize = 'mecab');

drop table

.load /home/pi/root/sys/env/tool/sqlite_ext/fts5_mecab
create virtual table posts using fts5(title, body, tokenize = 'mecab');
drop table posts;
drop table if exists posts;



対象環境

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

前回まで