4.3.1 包 DBI 和 RMySQL

Keywords: R

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,把表名字统一变成小写。

Hits:Loading...

special topic