83's

Top > Tags > SQLite

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

むう。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
  )