Next: , Previous: R interface packages, Up: R interface packages



4.3.1 包 DBI 和 RMySQL

CRAN 的包 RMySQL 提供了MySQL数据库系统的接口(见 http://www.mysql.com 和 Dubois,2000)。 这里的描述用于版本 0.5-0:早期版本有很多不一样的接口。 当前版本需要 DBI,这里的描述通过少量修改也可用于其它 支持DBI包的后端。

MySQL存在于 Unix/Linux 和 Windows 上面:从3.23.x版本开始(2001年1月), 它以GPL协议发布。MySQL是一个`轻量级'(light and lean)的数据库。 (在大小写敏感的文件操作系统,它支持名字的大小写。注意,Windows系统里面文件名大小写 不敏感。)1RMySQL在Linux和Windows系统上都可以使用。

dbDriver("MySQL") 的调用会返回一个数据库连接管理对象,然后 调用dbConnect打开一个数据库连接,随后会调用泛型函数 dbDisconnect 来关闭这个连接。 对于,ORACLE和SQLITE系统,分别使用ROracleRSQLite 里面的dbDriver("Oracle") 函数或 dbDriver("SQLite") 函数。

SQL 查询可以通过dbSendQuerydbGetQuery 传给数据库管理系统。dbGetQuery 传送查询语句, 把结果以数据框形式返回。dbSendQuery 传送查询,返回的结果是 继承"DBIResult"的一个子类的对象。"DBIResult" 类 可用于取得结果,而且还可以通过调用 dbClearResult 清除结果。

函数 fetch 用于获得查询结果的部分或全部行,并以列表返回。 函数 dbHasCompleted 确定是否所有行已经获得了, 而 dbGetRowCount 返回结果中行的数目。

这些是数据库中读/写/测试/删除表的方便接口。 dbReadTabledbWriteTable 实现一个 R 数据框的复制进和复制出数据库, 把数据框的行名字映射到 MySQL 表的 row_names 字段。

     > library(RMySQL) # will load DBI as well
     ## 打开一个MySQL数据库的连接
     > con <- dbConnect(dbDriver("MySQL"), dbname = "test")
     ## 列出数据库中表
     > dbListTables(con)
     ## 把一个数据框导入到数据库,删除任何已经存在的拷贝
     > data(USArrests)
     > dbWriteTable(con, "arrests", USArrests, overwrite = TRUE)
     TRUE
     > dbListTables(con)
     [1] "arrests"
     ## 获得整个表
     > dbReadTable(con, "arrests")
                    Murder Assault UrbanPop Rape
     Alabama          13.2     236       58 21.2
     Alaska           10.0     263       48 44.5
     Arizona           8.1     294       80 31.0
     Arkansas          8.8     190       50 19.5
     ...
     ## 从导入的表中查询
     > dbGetQuery(con, paste("select row_names, Murder from arrests",
                             "where Rape > 30 order by Murder"))
        row_names Murder
     1   Colorado    7.9
     2    Arizona    8.1
     3 California    9.0
     4     Alaska   10.0
     5 New Mexico   11.4
     6   Michigan   12.1
     7     Nevada   12.2
     8    Florida   15.4
     > dbRemoveTable(con, "arrests")
     > dbDisconnect(con)

Footnotes

[1] 译者注:MySQL给数据库表命名的时候要小心一点。SQL标准里面,表的 大小写不敏感,但MySQL在Linux下面可能大小写敏感。此时可以通过-O lower_case_table_names=1 参数启动 mysqld,把表名字统一变成小写。