#+File Created: <2017-02-09 Thu 13:42>
#+Last Updated: <2018-11-21 Wed 20:51>

SQLite3 の簡単な利用方法についてまとめておく.
いくつかの script 言語での書き方を比較する.


利用環境: OSX Yosemite 10.10.5

sqlite3 --version
3.13.0 2016-05-18 10:57:30 fc49f556e48970561d7ab6a2f24fdd7d9eb81ff2

1 perl

perl --version
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2013, Larry Wall

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

1.1 database の作成とデータの挿入

use strict;
use warnings;
use DBI;

my $db="test.db";
my $dbh=DBI->connect("dbi:SQLite:dbname=$db");

# テーブル作成
my $sql="create table if not exists test_table_pl (id int, name, age int, gender)";
$dbh->do($sql);  # 戻り値がない場合は do で実行
#my $kth=$dbh->prepare($sql);
#$kth->execute();

# placeholder によるデータの挿入
$sql    ="insert into test_table_pl values (?,?,?,?)";
# placeholder を用いる場合及び戻り値がある場合は,
# prepare -> execute で実行
my $sth =$dbh->prepare($sql);
my @vls =(1,'hoge',20,'m');
$sth->execute(@vls);

# 切断
$dbh->disconnect;

1.2 select 文とデータの取り出し

use strict;
use warnings;
use DBI;

my $db='test.db';
my $dbh = DBI->connect("dbi:SQLite:dbname=$db");

# select 文
my $sql = "select * from test_table_pl order by id";
my $sth = $dbh->prepare($sql);
$sth->execute();

# データの取り出し
while(my @row=$sth->fetchrow_array) {
  print join("\t",@row)."\n";
  print $row[0]."\n";
}
# hashref で取り出せる(が, 一回とると空になる)
while(my $row=$sth->fetchrow_hashref) {
  print $row->{id}."\t".$row->{name}."\n";
}
1 hoge  20  m
1

2 python

python --version
Python 3.5.2 :: Anaconda custom (x86_64)

2.1 database の作成とデータの挿入

import sqlite3
con = sqlite3.connect("test.db")
cur = con.cursor()

sql = "create table if not exists test_table_py (id int, name varchar(64), age int, gender varchar(32))"
cur.execute(sql)

sql = "insert into test_table_py values (?,?,?,?)"
vls = (1,'hoge',20,'m')
cur.execute(sql,vls);

con.commit()  # 変更の保存
con.close()

2.2 select 文とデータの取り出し

import sqlite3

con = sqlite3.connect("test.db")
cur = con.cursor()

sql = "select * from test_table_py order by id";
cur.execute(sql)

result = cur.fetchall()
for row in result:
    # tuple で返ってくる
    print(row)
    print(row[0])
(1, 'hoge', 20, 'm')
1

3 ruby

ruby --version
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-darwin14.3.0]

require 'sqlite3' がエラーとなるときはインストールします.

gem install sqlite3

3.1 database の作成とデータの挿入

require 'sqlite3'

db = SQLite3::Database.new("test.db")

sql = "create table if not exists test_table_rb (id int, name varchar(64), age int, gender varchar(32))"
db.execute(sql)

sql = "insert into test_table_rb values (1,'hoge',20,'m')"
db.execute(sql)

sql = "insert into test_table_rb values (?,?,?,?)"
vls = [2,'fuga',30,'f']
db.execute(sql,vls)
# db.execute(sql,2,'fuga',30,'f')
db.close

3.2 select 文とデータの取り出し

require 'sqlite3'

db = SQLite3::Database.new("test.db")
sql = "select * from test_table_rb order by id"
db.execute(sql) { |id,name,age,gender|
  print "#{id} #{name}\n"
}
# こんなふうにも書ける
db.execute(sql) do |row|
   puts row.join("\t")
end
# 選択結果を hash で得る
db.results_as_hash = true
db.execute(sql) do |row|
   puts row
   puts row["name"]
end
db.close
1 hoge
2 fuga
1 hoge  20  m
2 fuga  30  f
{"id"=>1, "name"=>"hoge", "age"=>20, "gender"=>"m", 0=>1, 1=>"hoge", 2=>20, 3=>"m"}
hoge
{"id"=>2, "name"=>"fuga", "age"=>30, "gender"=>"f", 0=>2, 1=>"fuga", 2=>30, 3=>"f"}
fuga

4 julia

julia --version
julia version 0.5.0

using SQLite でエラーとなる場合は Pkg.add("SQLite") でインストールします.

julia
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.5.0 (2016-09-19 18:14 UTC)
 _/ |\__'_|_|_|\__'_|  |
|__/                   |  x86_64-apple-darwin14.5.0

julia> Pkg.add("SQLite")

4.1 database の作成とデータの挿入

using SQLite

db  = SQLite.DB("test.db")
sql ="create table if not exists test_table_jl (id int, name, age int, gender)"
SQLite.query(db,sql)

sql = "insert into test_table_jl values (1,'hoge',20,'m')"
SQLite.query(db,sql)
# SQLite.execute!(db,sql)  # これでも良い

# placeholder を使った書き方
sql = "insert into test_table_jl values (?,?,?,?)"
stmt = SQLite.Stmt(db,sql)  # prepare みたいなもん
vls=[2,"fuga",22,"f"]
SQLite.bind!(stmt,vls)
SQLite.execute!(stmt)

4.2 select 文とデータの取り出し

using SQLite
db  = SQLite.DB("test.db")
sql ="select * from test_table_jl order by id"
ext = SQLite.query(db,sql)
println(ext)
2×4 DataFrames.DataFrame
│ Row │ id │ name   │ age │ gender │
├─────┼────┼────────┼─────┼────────┤
│ 1   │ 1  │ "hoge" │ 20  │ "m"    │
│ 2   │ 2  │ "fuga" │ 22  │ "f"    │

5 R

R --version
R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin14.5.0 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License versions 2 or 3.
For more information about these matters see
http://www.gnu.org/licenses/.

library("RSQLite") が失敗する場合は install.packages("RSQLite") でインストールします.

R
R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin14.5.0 (64-bit)

R は、自由なソフトウェアであり、「完全に無保証」です。
一定の条件に従えば、自由にこれを再配布することができます。
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。

R は多くの貢献者による共同プロジェクトです。
詳しくは 'contributors()' と入力してください。
また、R や R のパッケージを出版物で引用する際の形式については
'citation()' と入力してください。

'demo()' と入力すればデモをみることができます。
'help()' とすればオンラインヘルプが出ます。
'help.start()' で HTML ブラウザによるヘルプがみられます。
'q()' と入力すれば R を終了します。

> install.packages("RSQLite")

5.1 database の作成とデータの挿入

library("RSQLite")

con <- dbConnect(SQLite(),"test.db",synchronous="off")
sql <- "create table if not exists test_table_R (id int, name text, age int, gender text)"
dbSendQuery(con, sql)

sql <- "insert into test_table_R values (1,'hoge',20,'m')"
dbSendQuery(con,sql)

# placeholder を使うとき.
# select でも同じ感じで出来るっぽい.
# sql <- "select * from ..." になるだけ. dbSendQuery でいける see help(dbBind)
sql <- "insert into test_table_R values (?,?,?,?)"
res <- dbSendQuery(con,sql)
dbBind(res, c(1,'fuga',22,'f'))
dbFetch(res)
dbDisconnect(con)

R の場合, 組み込みのデータを使ってこれを SQLite に入れることがあるかも.

library("RSQLite")
con <- dbConnect(SQLite(), "testR.db", synchronous="off")
dbWriteTable(con,"iris",iris)  # iris のデータを "iris" table 内に入れる
sql <- "select * from iris order by 'Sepal.Length' limit 5"
res <- dbGetQuery(con,sql)
res
[1] TRUE
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa

5.2 select 文とデータの取り出し

library("RSQLite")
con <- dbConnect(SQLite(), "test.db", synchronous="off")
sql <- "select * from test_table_R order by id"
res <- dbGetQuery(con,sql)
res
dbDisconnect(con)
  id name age gender
1  1 hoge  20      m
2  1 fuga  22      f
[1] TRUE

6 javascript(node.js)

node --version
v7.4.0

6.1 database の作成とデータの挿入

var sqlite3 = require('sqlite3')
sqlite3.verbose();
var file='test.db';
var db = new sqlite3.Database(file); // file の代わりに :memory: だとメモリ上に作成
db.serialize(); // 非同期を解除
db.on('error', function(err) {console.error(err); process.exit(1); });
var sql='create table if not exists test_table_js (id int, name text, age int, gender text)';
db.run(sql);
sql = 'insert into test_table_js values (?,?,?,?)';
db.run(sql,1,'hoge',20,'m');

/* 以下のように hash でアクセスもできる
var sql = 'insert or ignore into test_table_js (id,name) values ($i,$n)';
du.run(sql,{$i:3, $n:'fuga'});
*/

var vls = [2,'foo',22,'f'];
db.run(sql,vls);
db.close();

6.2 select 文とデータの取り出し

var sqlite3 = require('sqlite3');
var file = 'test.db';
var db   = new sqlite3.Database(file);
db.serialize();
db.on('error',function(err) {console.error(err); process.exit(1); });

var sql  ='select * from test_table_js order by id';

// ひとつずつやる場合
db.each(sql,clbk01);

function clbk01(err,row) {  // row: 一つの結果行が返る
    //console.log(row.id+"\t"+row.name+"\t"+row.age);
    if (err) throw err;
    console.log(row)
}

// 全件とりだしてからなんかやる場合
// プレースホルダ使える(上の each でも同様に使える)
sql ='select * from test_table_js order by ?';
db.all(sql,'id',clbk02);

function clbk02(err, rows) { // rows: 結果全部の行が戻る
   if (err) throw err;
   rows.forEach(function(row) { console.log(row); });
}

6.3 参考URL

Node.jsでSQLite3を使用する - 情報アイランド
http://info-i.net/sqlite3
Node.jsでsqlite3を使ってデータベースを操作する方法まとめ | Black Everyday Company
http://kuroeveryday.blogspot.jp/2016/05/nodejs-sqlite3.html
JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript

Comments