SQLite3 の様々な言語での利用
javascript julia perl python r ruby
#+File Created:
#+Last Updated:
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
5.3 参考URL
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