12.6 访问数据库

如果数据需要被多人访问,那最好将它们存储在一个关系数据库中。有许多数据库管理系统(DBMS)用于关系数据库管理,R也可与所有常见的数据库相连接。DBI包为访问DBMS提供了统一的语法——目前的SQLite、MySQL/MariaDB、PostgreSQL和Oracle都能支持,它还提供了一个封装了JDBC(Java Database Connectivity)API的函数。(连接到SQL Server须使用不同的系统,我们将在下面看到。)

要连接到SQLite数据库,首先你须安装并加载DBI包及后端的RSQLite包:

  1. library(DBI)
  2. library(RSQLite)

然后,定义数据库驱动程序的类型是“SQLite”,并通过命名该文件来设置到数据库的连接:

  1. driver <- dbDriver("SQLite")
  2. db_file <- system.file(
  3. "extdata",
  4. "crabtag.sqlite",
  5. package = "learningr"
  6. )
  7. conn <- dbConnect(driver, db_file)

对于MySQL数据库来说,则需加载RMySQL包,并设置驱动器类型为“MySQL”:

  1. driver <- dbDriver("MySQL")
  2. db_file <- "path/to/MySQL/database"
  3. conn <- dbConnect(driver, db_file)

对于PostgreSQL、Oracle和JDBC来说,它们分别需要PostgreSQLROracleRJDBC包,它们的数据库名也是其驱动程序的名字,与SQLiteMySQL一样。

要从数据库中检索数据,你得写一些SQL查询语句,并使用dbGetQuery把它发送到数据库中。在下例中,SELECT * FROM IdBlock的意思是:从IdBlock表中取得所有列的数据3:

3任何称职的数据库管理员都会告诉你,SELECT *这种写法完全是偷懒,在你把代码随意地运行在服务器上之前,应该非常明确地指出你需要的哪些列。非常感谢!

  1. query <- "SELECT * FROM IdBlock"
  2. (id_block <- dbGetQuery(conn, query))
  3. ## Tag ID Firmware Version No Firmware Build Level
  4. ## 1 A03401 2 70

接着,在完成数据库操作之后,断开和卸载驱动程序以完成清理工作:

  1. dbDisconnect(conn)
  2. ## [1] TRUE
  3. dbUnloadDriver(driver)
  4. ## [1] TRUE

很容易一不小心就忘记关闭连接,特别是当你的连接发生错误时。要避免这种情况,一种方法是把你的代码封装到一个函数中,并在on.exit中确保清理代码始终会被执行。 on.exit在其父函数退出时会运行R的代码,不管它是否正确地完成或发生了错误。我们可以使用更安全的代码重写之前的范例,如下:

  1. query_crab_tag_db <- function(query)
  2. {
  3. driver <- dbDriver("SQLite")
  4. db_file <- system.file( "extdata", "crabtag.sqlite", package = "learningr" )
  5. conn <- dbConnect(driver, db_file)
  6. on.exit(
  7. {
  8. #此代码在函数之后运行,
  9. #即使抛出一个错误
  10. dbDisconnect(conn)
  11. dbUnloadDriver(driver)
  12. }
  13. )
  14. dbGetQuery(conn, query)
  15. }

向函数传入一些SQL代码来查询螃蟹标签的数据库:

  1. query_crab_tag_db("SELECT * FROM IdBlock")
  2. ## Tag ID Firmware Version No Firmware Build Level
  3. ## 1 A03401 2 70

在此例中,DBI包提供了一个很实用的函数,使我们不用自己写SQL代码。dbReadTable做你所期望的事:当忘记你想要的表的名称时,它将从已连接的数据库中读取表(使用dbListTables (conn)):

  1. dbReadTable(conn, "idblock")
  2. ## Tag ID Firmware Version No Firmware Build Level
  3. ## 1 A03401 2 70
  4. ## [1] TRUE
  5. ## [1] TRUE

如果你的数据库没有出现在以上列出的类型之中,可以使用替代的RODBC包,它使用ODBC数据库连接——当连接到SQL Server或Access数据库时,这非常有用。与DBI相比,这些函数有着不同的名称,但原理非常相似。设置电脑上的ODBC数据源(通过Windows下的控制面板,或在“开始”菜单中搜索“ODBC”),R就可连接上。图12-1显示了Windows 7上的OBDC注册向导。

图像说明文字

图12-1:使用ODBC数据源管理器注册ODBC数据源

然后,调用odbcConnect连接,使用sqlquery运行查询,以及odbcClose在最后进行清理:

  1. library(RODBC)
  2. conn <- odbcConnect("my data source name")
  3. id_block <- sqlQuery(conn, "SELECT * FROM IdBlock")
  4. odbcClose(conn)

从R中访问NoSQL数据库(即Not only SQL的简称。它是轻量级的数据存储仓库,比起传统的SQL关系数据库更易扩展)的方法不太成熟。可以通过RMongormongodb包访问MongoDB,使用RCassandra包访问Cassandra数据库,以及R4CouchDB包访问CouchDB[还没出现在CRAN上,但可以在GitHub下载] 。