〜Gauche on Railsへの道〜 2. ActiveRecord 風のものを作る。その2

DBアクセス

GaucheRDBライブラリーは Perl(CPAN)と同じように、DBI/DBD (DB非依存/DB依存)という2つのレイヤーのライブラリーからできていて、通常は DBI のみ使い、RDBをアクセスします。

指定された、テーブルのカラム情報(カラム名、型)を取得する関数は下のようになります。ただし、このコードはMySQL専用です。

(define *data-source-name* "dbi:mysql:db=yy")
(define (db-connect)
  (let ((conn (dbi-connect *data-source-name*)))
    (dbi-do conn "SET NAMES utf8")
    conn))

(define (db-column-info conn table-name)
  (let* ((query (dbi-prepare conn 
                         "select column_name,data_type from information_schema.columns where table_name = ? order by ordinal_position"))
	 (result (dbi-execute query table-name)))
    (values
     (list->vector (map (lambda(row) (ref row 0)) result))
     (list->vector (map (lambda(row) (ref row 1)) (ref result 'rows)))
     )))

実行すると、以下のようにカラム名、型を文字列のベクターで戻してくれます(関数から複数の値を戻す事ができます)。

gosh> (db-column-info (db-connect) "todos")
#("id" "due" "task" "memo" "created_at" "updated_at")
#("int" "date" "varchar" "text" "datetime" "datetime")

少し変わっているのは、selectの結果は なのですが dbi-execute を実行した時点では select結果は fetch されてなく、を操作する map や for-each 等の実行時に fetch されます。
また、一度 fetch された結果は result の rows というスロットに格納されてます。