1 min read

R数据库交互系列笔记:DBI包

DBI是DataBase Interface的简称,即数据库界面。这篇笔记的主要内容是讲一讲如何用R中的DBI包来与常见数据库进行交互。

1 简介

DBI定义了一个与RDBMS类型数据库进行通信的泛型接口,对于任意一个RDBMS,DBI都会有一个兼容的数据库驱动来实现对接。目前,其可用的驱动包括Oracle、MySQL和SQLite等。

理论上说,DBI的泛型接口允许我们同样的代码来跟不同的RDBMS进行通信。但实际应用的时候,还要看具体的RDBMS与SQL标准的是否完全相似,以及数据库开发者开发过程中是否避免使用RDBMS特有的一些功能。

下面以SQLite数据库为例说明一下。例子中用的是Affymetrix hgu95av2的微阵列芯片数据,用之前先加载相关的包。

library(tools)
library("RBioinf")
library("DBI")
library("RSQLite")
dbPath <- "hgu95av2-sqlite.db"

2 DBI连接SQLite数据库

DBI连接RDBMS需要两步。第一步,用dbDriver函数创建一个适合的数据库驱动;第二步,用dbConnect函数创建数据库连接。具体到SQLite,只需要指定包含数据库的文件夹路径即可。而对于MySQL或者Oracle,则需要指定主机地址、用户名和密码等信息。

drv <- dbDriver("SQLite")
db <- dbConnect(drv, dbPath)
db

dbDisconnect函数可以断开连接。

dbDisconnect(db)

3 查询数据库结构

可以用dbListTables和dbListFields函数来列出数据库中的表名以及各表对应的字段(列名)。

db <- dbConnect(drv, dbPath)
dbListTables(db)
dbListFields(db, "go_probe")

4 查询语句

dbSendQuery函数可以执行任意SQL语句。返回的结果是DBI结果的子类,这个子类的结果可以用fetch函数来查询。为了节约内存,用不到的数据库查询对象可以用dbClearResult函数进行清除。

fetch函数可以将查询结果转为数据框。dbColumnInfo、dbGetRowsAffected和dbGetRowCount函数可以返回更多关于查询的信息。下面分别演示。

sql <- "select affy_id, evi from go_probe"
rs <- dbSendQuery(db, sql)
rs

DBIResult实例包含了查询的相关信息。

dbColumnInfo(rs)
dbGetStatement(rs)
dbGetRowsAffected(rs)

具体的结果可用fetch函数查看。

chunk <- fetch(rs, n = 5)
chunk

dbGetRowCount函数范围所有查询结果的行数。

dbGetRowCount(rs)

当不再用某个DBIResult实例时,记得清除。

dbClearResult(rs)
rs

5 基于查询结果构建R中的数据对象

sql <- "select * from go_probe"
rs <- dbSendQuery(db, sql)
dat <- fetch(rs, n = 500)
goList <- split(dat$go_id, dat$affy_id)

6 ODBC

RODBC包可以连接ODBC数据源,当然前提是安装相应的数据库驱动。R导入与导出中给出了一些使用RODBC的实例,可以供参考。用ODBC连接RDBMS时,需要指定一个ODBC数据服务,具体如何做要看所用的操作系统。

RBioinf包中提供Gavin和Ho提供关于AP-MS蛋白质实验结果数据,分别给出了pcomplex.txt和pcomplex.xls两种格式,下面用它来演示下RODBC的用法。

数据包括三列:bait-protein,experiment和prey-protein。下面的结果仅在Windows系统下才能重现。

library("RODBC")
if (.Platform$OS.type == "Windows") {
 pcomplexXls <- system.file("extdata/pcomplex.xls", package = "RBioinf")
 db <- odbcConnectExcel(pcomplexXls)
 }
if (!is.null(db)) {
 sqlTables(db)
 sqlQuery(db, "select * from [Sheet1$] limit 5")
 }

7 参考文献

Seth Falcon,How to Use DBI: Connecting to Databases with R,January 17, 2006。