Guile Scheme 之 dbi

发布于 2022-09-02 23:39:06 字数 4019 浏览 22 评论 0

本帖最后由 Lispor 于 2010-12-03 19:01 编辑

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 后端.

1.1 历史

2004 年, Maurizio Boriani 写道:

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

2008 年, Linas Vepstas 写道:

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

1.2 获取 Guile DBI

你可以从 http://www.gna.org/projects/guile-dbi/ 网页获得 Guile dbi 最新版本.

2. 使用手册

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

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

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

  1. (use-modules (dbi dbi))
  2. ;; Log into the database.
  3. (define db-obj (dbi-open "sqlite3" "my-example-db"))
  4. ;; Create a table.
  5. (dbi-query db-obj "create table hellotable(id int, name varchar(15))")
  6. ;; Look at the return status of the last SQL command
  7. (display db-obj) (newline)
  8. ;; Populate the table with values.
  9. (dbi-query db-obj
  10.            "insert into hellotable ('id', 'name') values('33', 'ola')")
  11. (dbi-query db-obj
  12.            "insert into hellotable ('id', 'name') values('34', 'dzien dobre')")
  13. (dbi-query db-obj
  14.            "insert into hellotable ('id', 'name') values('44', 'annyong haseyo')")
  15. (display db-obj) (newline)
  16. ;; Display each of the rows of the table, in turn.
  17. (dbi-query db-obj "select * from hellotable")
  18. (display db-obj) (newline)
  19. (write (dbi-get_row db-obj)) (newline)
  20. (write (dbi-get_row db-obj)) (newline)
  21. (write (dbi-get_row db-obj)) (newline)
  22. (write (dbi-get_row db-obj)) (newline)
  23. ;; Close the database.
  24. (dbi-close db-obj)
  25. (display db-obj) (newline)

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

  1. #!/usr/bin/guile -e main -s
  2. !#
  3. (use-modules (dbi dbi))
  4. (define ciccio (dbi-open "mysql"
  5.                          "user:pass:pluto:tcp:localhost:3306"))
  6. (define ret #f)
  7. ;; (define ciccio (dbi-open "mysql"
  8.                             "user:pass:pluto:socket:/tmp/mysql.sock"))
  9. (define main
  10.   (lambda (args)
  11.     (display "HERE")(newline)
  12.     (display ciccio)(newline)
  13.     (dbi-query ciccio "select * from pippo")
  14.     (display ciccio)(newline)
  15.     (set! ret (dbi-get_row ciccio))
  16.     (while (not (equal? ret #f))
  17.            (display ret)(newline)
  18.            (set! ret (dbi-get_row ciccio))
  19.            )
  20.     (display ret)(newline)
  21. ))

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文