SQLiteは小規模なデータに適したデータベースとされる。
- 長所:始めるのが簡単
- 短所:大規模なデータに向かない
どの程度までが小規模なデータなのかはよくわからないが、SQLiteでなにか困ることがあれば、そのとき代替(MySQL, PostgreSQL, Google BigQuery,...?)を検討することにする。
SQLite3のインストール
Macには最初からインストールされている。
ターミナルで "sqlite3 -version" とタイプすると次のように表示されるはずだ。
$ sqlite3 -version 3.28.0 2019-04-15 14:49:49
バージョンが古い場合は素直に新しいものを入れ直したほうが無難である。
現時点で 2021-06-18 (3.36.0) が最新。
https://www.sqlite.org/changes.html
brew install sqlite3
パスを通す。bashを使っている場合、
echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> .bash_profile
zshを使っている場合、
echo 'export PATH="/usr/local/opt/sqlite/bin:$PATH"' >> .zprofile
確認。
$ sqlite3 -version 3.36.0 2021-06-18 18:36:39
SQLite3を起動する
データベースのファイル "products.sqlite" を指定して起動する。ファイルの置き場はどこでもいい。"products.sqlite" が存在しない場合、これでカレントディレクトリに新規作成される。
$ sqlite3 products.sqlite SQLite version 3.36.0 2021-06-18 18:36:39 Enter ".help" for usage hints.
table を作る
SQLite のデータ型には次のものがある:
- NULL. The value is a NULL value.
- INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value.
- REAL. The value is a floating point value, stored as an 8-byte IEEE floating point number.
- TEXT. The value is a text string, stored using the database encoding (UTF-8, UTF-16BE or UTF-16LE).
- BLOB. The value is a blob of data, stored exactly as it was input.
Boolean 型はない。
データ型を指定しなくても table を作ることはできる。その場合、型は適当に推測されるようである(ここでの「適当」は必ずしも「妥当」とか「適切」という意味ではない)。
create table Tokyo( AA text, BB text, CC integer);
CSVファイルを読み込む
CSVファイルを読み込み場合、mode を csv にしておく(試したことはないが JSON などの mode もあるようだ)。
.mode csv
import する。
.import --skip 1 dat1.csv Tokyo
確認。
PRAGMA table_info(Tokyo);
確認。
select * from Tokyo limit 6;
確認。
select count(*) from Tokyo;
SQLiteを終了する
.quit または .exit
失敗した場合
Tokyo という table を削除する場合は次のようにする。
drop table Tokyo;
ついでに vacuum; もしとくといいかも。VACUUM
SQLiteではデータベースは一個のファイル(ここでは "products.sqlite")のみで管理されているようである。そのため、どんなに派手に失敗した最悪の場合でもファイル("products.sqlite")を削除してやり直せばよい。
バッチ処理
「このフォルダのファイルを全部インポート」というような形で、複数のCSVファイルを読み込みたい。しかし、うまいやりかたがわからなかった。素直に以下のようにする。
"create_table.sql" などのファイル名でファイルを作ってコマンドをまとめて書く。上述のコマンドの .import するファイルと table の部分を置き換えて何度もコピー・アンド・ペーストすればよい。コピー・アンド・ペーストに関しては適当なプログラムを使えば手作業をなくせる。ターミナルから次のように実行。
sqlite3 products.sqlite ".read create_table.sql"
以下Rの話
RからSQLiteを呼ぶ。クエリを直に書くならこれでいい。
library(DBI) library(RSQLite) con <- dbConnect(SQLite(),"products.sqlite") test <- dbGetQuery(con, "select * from Tokyo limit 10") test2 <- dbGetQuery(con, "select * from Osaka limit 10") dbDisconnect(con)
しかし、dplyrを使ったほうが便利。Using dplyr with databases
例えば、
library(dplyr) con <- DBI::dbConnect(RSQLite::SQLite(), "products.sqlite") DBI::dbListTables(con) tokyo_db <- tbl(con, "Tokyo") osaka_db <- tbl(con, "Osaka") print(colnames(tokyo_db)) print(colnames(osaka_db)) q1 <- dplyr::select(osaka_db, KEY, BB, CC) %>% dplyr::filter(BB=="MOU4444") %>% inner_join(tokyo_db, by=c("KEY" = "AA")) S1 <- collect(q1) #collect()したときはじめてデータを呼びに行く dbDisconnect(con) #閉じる show_query(S1) #実際に実行されるクエリはこれ。 head(S1)
おしまい。