--- title: Gaucheでsqlite3を使用する author: kazu634 date: 2012-04-15 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:5457;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - sqlite3 ---

いつの間にか「kikuchi」で配布されていたsqlite3用のライブラリがダウンロードできなくなっていて、一瞬パニックになりましたが、githubで別な方が公開していらっしゃるみたいでした。「mhayashi1120/Gauche-dbd-sqlite3 ? GitHub」です。

インストール方法

とりあえず以下のようにしてインストールしました:

% git clone git://github.com/mhayashi1120/Gauche-dbd-sqlite3.git
% cd Gauche-dbd-sqlite3/
% ./DIST gen
% ./configure
% make
% make install

makeのところでなんかこけた記憶があるのですが、たしか「-l」オプションをひとつMakefileから削除した記憶が。。。

使い方

とりあえずこんな感じで使ってみました。ちなみにカレントディレクトリにquote.dbというsqlite3用のファイルがある前提です:

;; ==============================
;; Libraries:
;; ==============================
(use dbi)
(use gauche.collection)
(define (execute-sql dbfile sql)
(guard
(e ((<dbi-parameter-error> e) (dbi-close connect))
((<dbi-error> e) (exit 1))
(else (raise e)))
(let* ((connect (dbi-connect (string-append "dbi:sqlite3:"
dbfile)))
(query (dbi-prepare connect sql))
(result (dbi-execute query)))
(dbi-close connect)
result)))
(define *sql-result*
(execute-sql "quote.db"
"SELECT * from quote ORDER BY id DESC LIMIT 10;"))

execute-sqlは

  1. sqlite3用のファイル
  2. 実行するsql文

を引数にとり、実行した結果(リレーション)を返します。

1カラム目と2カラム目を標準出力に表示する

次のようにしてみました:

(for-each (lambda (row)
(format (current-output-port)
"id:~a\ndate:~a\n"
(dbi-get-value row )
(dbi-get-value row 1)))
*sql-result*)

実行結果はこのような感じです:

% gosh 2012-04-14-122932.scm
id:10370
date:1334359203
id:10369
date:1334361235
id:10368
date:1334327565
id:10367
date:1334239319
id:10366
date:1334235069
id:10365
date:1334186403
id:10364
date:1334177624
id:10363
date:1334177843
id:10362
date:1334152357
id:10361
date:1334152804
DBのカラム名を取得し、標準出力に表示する

次のようにしてみました:

(for-each (lambda (column-name)
(format (current-output-port)
"~a\n"
column-name))
(relation-column-names *sql-result*))

実行結果はこのような感じです:

% gosh 2012-04-14-122932.scm
id
date
quote
source
md5
各カラムの値を取得し、標準出力に表示する

次のようにしてみました:

(let* ((column-names
(relation-column-names *sql-result*))
(getter (relation-accessor *sql-result*)))
(for-each (lambda (row)
(map (lambda (column)
(format (current-output-port)
"~a:\n~a\n"
column
(getter row column)))
column-names))
*sql-result*))

実行結果はこのような感じです:

% gosh 2012-04-14-122932.scm
id:
10370
date:
1334359203
quote:
抑止力とは、「戦う意思を持たない暴力」ではなく、「戦わない意志を持った暴力」のことなのだと思う。小さな違いだけれど、意思を示さない限り、それは「力」たりえない。 (via @medtoolz)
source:
http://twitter.com/medtoolz/status/190930863851184129
md5:
6392e235cebdae0ac9c87ee958648fc0

さてと

もう少し遊んでみます。