--- 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は
を引数にとり、実行した結果(リレーション)を返します。
次のようにしてみました:
(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
次のようにしてみました:
(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
もう少し遊んでみます。