複数の SQLite 3 データベースの一括統合
【概要】
このページでは,このページ集の各演習で作成した複数の SQLite 3 データベースを,1 つのデータベース alldb に統合する体験を行う。 仕組みは単純で,各データベースを .dump で SQL 文(テーブル定義とデータ挿入の文)としてダンプし,それらを新しいデータベースに .read で順に読み込む,というものである。
統合の対象とするデータベース(それぞれの作り方は各ページで説明): bstopdb(バス停),estatdb(統計),ipadicdb(形態素解析辞書),quotedb(外国為替),zipdb(郵便番号),stldb(STL 三角形ポリゴン),ekidb(駅),osmdb(Open Street Map),rdataset(R のデータセット),lbmadb(金価格)
◆ 作成するSQLite 3 データベース: alldb
【目次】
【サイト内の関連情報】
第1章 前提と準備
- 統合の対象とする各データベースが,あらかじめ /tmp の下に作成済みであること(各ページの手順で作成する)。一部のデータベースが未作成でも,その .read の行を削るだけで残りは統合できる。
- SQLite 3 がインストール済みであること。SQLite 3 のインストールは別ページ »で説明。
- ヒント: 統合がうまくいく前提として,データベース間でテーブル名が重複していない必要がある。テーブル名が重複していると,.read の途中で「table ... already exists」のエラーになる。
第2章 一括統合の手順
次の bash プログラムを実行する。前半で各データベースを /tmp/<データベース名>.sql にダンプし,後半でそれらを新しいデータベース /tmp/alldb に順に読み込む。
◆ bash プログラム
#!/bin/bash
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/bstopdb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/bstopdb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/estatdb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/estatdb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/ipadicdb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/ipadicdb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/quotedb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/quotedb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/zipdb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/zipdb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/stldb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/stldb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/lbmadb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/lbmadb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/ekidb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/ekidb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/osmdb.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/osmdb
# dump
cat >/tmp/a.$$.sql <<-SQL
.output /tmp/rdataset.sql
.dump
.exit
SQL
#
cat /tmp/a.$$.sql | sqlite3 /tmp/rdataset
# load
cat >/tmp/a.$$.sql <<-SQL
.read /tmp/bstopdb.sql
.read /tmp/estatdb.sql
.read /tmp/ipadicdb.sql
.read /tmp/quotedb.sql
.read /tmp/zipdb.sql
.read /tmp/stldb.sql
.read /tmp/lbmadb.sql
.read /tmp/ekidb.sql
.read /tmp/osmdb.sql
.read /tmp/rdataset.sql
vacuum;
.exit
SQL
#
rm -f /tmp/alldb
cat /tmp/a.$$.sql | sqlite3 /tmp/alldb
◆ 確認手順
統合後のデータベースに含まれるテーブルの一覧と,件数の例を表示する。
echo '.tables' | sqlite3 /tmp/alldb
echo 'select count(*) from stl;' | sqlite3 /tmp/alldb
echo 'select count(*) from lbma;' | sqlite3 /tmp/alldb
考察ポイント
- .dump は,データベースの内容を「実行すれば元のデータベースを再現できる SQL 文の列」に変換する。ダンプしたファイル(たとえば /tmp/stldb.sql)を less などで開き,どのような SQL 文が並んでいるかを確認してみること。
- ダンプと読み込みによる方式のほかに,SQLite 3 には attach database を使って別データベースのテーブルを直接コピーする方法もある。両者の違い(ファイルとして持ち運べるか,実行速度など)を考えてみること。
- 最後の vacuum の役割(未使用領域の回収によるファイルサイズの縮小)を,vacuum の前後でファイルサイズを比べて確認してみること。