12.6 访问数据库
如果数据需要被多人访问,那最好将它们存储在一个关系数据库中。有许多数据库管理系统(DBMS)用于关系数据库管理,R也可与所有常见的数据库相连接。DBI包为访问DBMS提供了统一的语法——目前的SQLite、MySQL/MariaDB、PostgreSQL和Oracle都能支持,它还提供了一个封装了JDBC(Java Database Connectivity)API的函数。(连接到SQL Server须使用不同的系统,我们将在下面看到。)
要连接到SQLite数据库,首先你须安装并加载DBI
包及后端的RSQLite
包:
library(DBI)
library(RSQLite)
然后,定义数据库驱动程序的类型是“SQLite”,并通过命名该文件来设置到数据库的连接:
driver <- dbDriver("SQLite")
db_file <- system.file(
"extdata",
"crabtag.sqlite",
package = "learningr"
)
conn <- dbConnect(driver, db_file)
对于MySQL数据库来说,则需加载RMySQL
包,并设置驱动器类型为“MySQL”:
driver <- dbDriver("MySQL")
db_file <- "path/to/MySQL/database"
conn <- dbConnect(driver, db_file)
对于PostgreSQL、Oracle和JDBC来说,它们分别需要PostgreSQL
、ROracle
和RJDBC
包,它们的数据库名也是其驱动程序的名字,与SQLite
和MySQL
一样。
要从数据库中检索数据,你得写一些SQL查询语句,并使用dbGetQuery
把它发送到数据库中。在下例中,SELECT * FROM IdBlock
的意思是:从IdBlock表中取得所有列的数据3:
3任何称职的数据库管理员都会告诉你,SELECT *
这种写法完全是偷懒,在你把代码随意地运行在服务器上之前,应该非常明确地指出你需要的哪些列。非常感谢!
query <- "SELECT * FROM IdBlock"
(id_block <- dbGetQuery(conn, query))
## Tag ID Firmware Version No Firmware Build Level
## 1 A03401 2 70
接着,在完成数据库操作之后,断开和卸载驱动程序以完成清理工作:
dbDisconnect(conn)
## [1] TRUE
dbUnloadDriver(driver)
## [1] TRUE
很容易一不小心就忘记关闭连接,特别是当你的连接发生错误时。要避免这种情况,一种方法是把你的代码封装到一个函数中,并在on.exit
中确保清理代码始终会被执行。 on.exit
在其父函数退出时会运行R的代码,不管它是否正确地完成或发生了错误。我们可以使用更安全的代码重写之前的范例,如下:
query_crab_tag_db <- function(query)
{
driver <- dbDriver("SQLite")
db_file <- system.file( "extdata", "crabtag.sqlite", package = "learningr" )
conn <- dbConnect(driver, db_file)
on.exit(
{
#此代码在函数之后运行,
#即使抛出一个错误
dbDisconnect(conn)
dbUnloadDriver(driver)
}
)
dbGetQuery(conn, query)
}
向函数传入一些SQL代码来查询螃蟹标签的数据库:
query_crab_tag_db("SELECT * FROM IdBlock")
## Tag ID Firmware Version No Firmware Build Level
## 1 A03401 2 70
在此例中,DBI
包提供了一个很实用的函数,使我们不用自己写SQL代码。dbReadTable
做你所期望的事:当忘记你想要的表的名称时,它将从已连接的数据库中读取表(使用dbListTables (conn)
):
dbReadTable(conn, "idblock")
## Tag ID Firmware Version No Firmware Build Level
## 1 A03401 2 70
## [1] TRUE
## [1] TRUE
如果你的数据库没有出现在以上列出的类型之中,可以使用替代的RODBC
包,它使用ODBC数据库连接——当连接到SQL Server或Access数据库时,这非常有用。与DBI
相比,这些函数有着不同的名称,但原理非常相似。设置电脑上的ODBC数据源(通过Windows下的控制面板,或在“开始”菜单中搜索“ODBC”),R就可连接上。图12-1显示了Windows 7上的OBDC注册向导。
图12-1:使用ODBC数据源管理器注册ODBC数据源
然后,调用odbcConnect
连接,使用sqlquery
运行查询,以及odbcClose
在最后进行清理:
library(RODBC)
conn <- odbcConnect("my data source name")
id_block <- sqlQuery(conn, "SELECT * FROM IdBlock")
odbcClose(conn)
从R中访问NoSQL数据库(即Not only SQL的简称。它是轻量级的数据存储仓库,比起传统的SQL关系数据库更易扩展)的方法不太成熟。可以通过RMongo
或rmongodb
包访问MongoDB,使用RCassandra
包访问Cassandra数据库,以及R4CouchDB
包访问CouchDB[还没出现在CRAN上,但可以在GitHub下载] 。