SQLite
タイトル一覧を表示 | 本文を表示
GaucheでMySQL/SQLiteの個人的まとめ February 05, 2008 21:49
大体使い方がわかってきた。Gauche:DBI/DBD見れば わかるけど、一応流れをメモっておく。
MySQLのドライバはDBI | dev | Kahua Projectから、SQLite3のはそのページに見当たらないのでuchizonoにあったものを使わせてもらた。
レッツ・コネクト。
(use dbi) (define *mysql-con* (dbi-connect "dbi:mysql:db=test;host=localhost" :username "root" :password "himitsu")) (define *sqlite-con* (dbi-connect "dbi:sqlite3:path/to/db/test.db"))
クエリ。
(let1 q (dbi-prepare *mysql-con* "insert into books (name, price) values (?, ?)")
(for-each (pa$ apply dbi-execute q)
'(("JavaScript" 4200) ("On Lisp" 3800))))
?に値を入れられるのがイカス。つまり
(dbi-execute q "JavaScript" 4200)
で1つめの?に"JavaScript"、2つめの?に4200。
手軽にやりたければ
(dbi-do *mysql-con* "insert into books (name, price) values (\"SICP\", 4600)")
次は結果の取り出し。
dbd/mysql.scmを見ると、クエリ結果のクラス<mysql-result-set>は
<relation>と<sequence>を継承してる。
gosh> (use gauche.sequence) gosh> (for-each print (dbi-do *mysql-con* "select * from books")) #(1 4200 JavaScript) #(2 3800 On Lisp) #t
各レコードはベクタになってた。
ちなみにSQLiteのほうの<sqlite3-result-set>は<collection>を継承してる。
gosh> (use gauche.collection) gosh> (for-each print (dbi-do *sqlite-con* "select * from books")) (1 4200 JavaScript) (2 3800 On Lisp) #t
こっちはリストだった。
SQL logic error or missing database October 27, 2007 23:45
- Permalink
- Comments (2380)
- Trackbacks (0)
SQLite, Ruby, ActiveRecord
むう。ActiveRecordでSQLite3使ってみてるんだけど、スレッドの数2つ以上にして読み書きしてると SQL logic error or missing databaseてのが出るよ。 書き込みが集中してるときに出てるみたい。スレッドセーフじゃないのかな……。
あとtimeout指定してるのにたまにSQLite3::BusyException飛んでくるし。 まったく! SQLiteはまったく!
一応バージョン書いておくか……。最新の3.5じゃないんだねubuntuタン。
% sqlite3 --version 3.4.2
そういえばRailsのconfig/database.ymlでtimeout書けるのをソース見て知ったよ。
development:
adapter: sqlite3
dbfile: db/development.db
timeout: 10000
でもググると常識ぽい。
普通に使うときはこう。
ActiveRecord::Base.establish_connection(
:adapter => "sqlite3",
:dbfile => "foo.db",
:timeout => 10000
)
