Fu
Simple is Beautiful!

guile scheme之dbi

Guile-dbi(data base interface) 为 guile 提供了一种简单、通用和易于使用的各种数据库接口, 例如, Postgres, MySQL 或者是 SQLite.

guile-dbi 被分为两部分: DBI(database independent) 和 DBD(database dependent) 插件, DBI 为 guile提供操作接口, 而 DBD 插件为 scheme 连接特定的 SQL server. 现在, 只有 Postgres, MySQL 和 SQLite3 的 DBD 后端.

历史

2004 年, Maurizio Boriani 写道:

我在寻找一个为 guile scheme 提供通用的 database 库, 虽然找到了一些, 但是他们并不是真正的 'dynamic', 只是几个不同的后端简单的编译而成, 而我寻找的是像 perl, php, tcl等语言的 dbi 系统, 其可以在运行时连接 database driver, 最后没有寻找到, 因此我就写了一个.

2008 年, Linas Vepstas 写道:

我在寻找一个为 guile scheme 提供通用的 database 库, 并且这是我找到的唯一具有文档说明, 能够保证工作的一个. 经过一些补丁后, 满足了我的需求, 现在我就在我的 OpenCog NLP 子系统工程里使用它.

获取 Guile DBI

你可以从 [https://github.com/eestrada/guile-dbi][] 网页获得 Guile dbi 最新版本.

使用手册

scheme 接口非常简单, 只有 5 个函数: dbi-open, dbi-close, dbi-query, dbi-get_status 和 dbi-get_row.

只要有相应的 dbd backend, guile DBI 可以支持任何数据库, 目前只有 MySQL, Postgres 和 SQLite 后端.

下面是一个 SQLite3 的使用实例:

(use-modules (dbi dbi))
 
;; Log into the database.
(define db-obj (dbi-open "sqlite3" "my-example-db"))
 
;; Create a table.
(dbi-query db-obj "create table hellotable(id int, name varchar(15))")
 
;; Look at the return status of the last SQL command
(display db-obj) (newline)
 
;; Populate the table with values.
(dbi-query db-obj "insert into hellotable ('id', 'name') values('33', 'ola')")
(dbi-query db-obj "insert into hellotable ('id', 'name') values('34', 'dzien dobre')")
(dbi-query db-obj "insert into hellotable ('id', 'name') values('44', 'annyong haseyo')")
(display db-obj) (newline)
 
;; Display each of the rows of the table, in turn.
(dbi-query db-obj "select * from hellotable")
(display db-obj) (newline)
(write (dbi-get_row db-obj)) (newline)
(write (dbi-get_row db-obj)) (newline)
(write (dbi-get_row db-obj)) (newline)
(write (dbi-get_row db-obj)) (newline)
 
;; Close the database.
(dbi-close db-obj)
(display db-obj)(newline)

下面是使用 MySQL 数据库的一个实例. 这个实例假定 MySQL 服务已经运行, 并且一个名为 pippo 的 table 已经被创建, 并被存储了一些数据:

#!/usr/bin/guile -e main -s
!#
 
(use-modules (dbi dbi))
  
(define ciccio (dbi-open "mysql" "user:pass:pluto:tcp:localhost:3306"))
(define ret #f)
;; (define ciccio (dbi-open "mysql" "user:pass:pluto:socket:/tmp/mysql.sock"))
 
(define main
  (lambda (args)
    (display "HERE")(newline)
    (display ciccio)(newline)
    (dbi-query ciccio "select * from pippo")
    (display ciccio)(newline)
    (set! ret (dbi-get_row ciccio))
    (let loop ()
         (if (not (equal? ret #f))
             (begin
              (display ret)(newline)
              (set! ret (dbi-get_row ciccio))
              (loop))))
    (display ret) (newline)))
scheme30
2010-12-06 14:36:00