上一页: 使用 DBI 的包,上一级: R 接口包 [目录][索引]
4.3.2 RODBC 包 ¶
CRAN 上的 RODBC 包提供了对支持 ODBC 接口的数据库源的接口。 这是非常广泛可用的,并且允许相同的 R 代码访问不同的数据库系统。 RODBC 在 Unix/Linux、Windows 和 macOS 上运行,几乎所有数据库系统都提供对 ODBC 的支持。 我们已经在 Windows 上测试了 Microsoft SQL Server、Access、MySQL、PostgreSQL、Oracle 和 IBM DB2,以及 Linux 上的 MySQL、MariaDB、Oracle、PostgreSQL 和 SQLite。
ODBC 是一个客户端-服务器系统,我们已经成功地从 Windows 客户端连接到运行在 Unix 服务器上的 DBMS,反之亦然。
在 Windows 上,ODBC 支持是操作系统的一部分。 在 Unix/Linux 上,您将需要一个 ODBC 驱动程序管理器,例如 unixODBC (https://www.unixodbc.org/) 或 iOBDC (https://www.iodbc.org/:这在 macOS 中预先安装) 以及您数据库系统的已安装驱动程序。
Windows 不仅为 DBMS 提供驱动程序,还为 Excel (.xls) 电子表格、DBase (.dbf) 文件甚至文本文件提供驱动程序。(不需要安装上面提到的应用程序。支持的文件格式取决于驱动程序的版本。)有适用于 Excel 和 Access 2007/2010 的版本(访问 https://www.microsoft.com/en-us/download/default.aspx,搜索“Office ODBC”,这将引导您找到 AccessDatabaseEngine.exe),以及“2007 Office System Driver”(后者有适用于 64 位 Windows 的版本,并且也可以读取早期版本)。
在 macOS 上,Actual Technologies (https://www.actualtech.com/product_access.php) 驱动程序为 Access 数据库和 Excel 电子表格(不包括 Excel 2007/2010)提供 ODBC 接口。
可以建立多个并发连接。通过调用 odbcConnect 或 odbcDriverConnect(在 Windows GUI 上,这允许通过对话框选择数据库)打开连接,该调用返回一个句柄,用于后续访问数据库。打印连接将提供有关 ODBC 连接的一些详细信息,调用 odbcGetInfo 将提供有关客户端和服务器的详细信息。
通过调用 close 或 odbcClose 关闭连接,并且当没有 R 对象引用它时以及在 R 会话结束时也会关闭连接(并发出警告)。
可以使用 sqlTables 查找连接上的表的详细信息。
函数 sqlSave 将 R 数据框复制到数据库中的表,而 sqlFetch 将数据库中的表复制到 R 数据框。
一个 SQL 查询可以通过调用 sqlQuery 发送到数据库。这将返回一个 R 数据框中的结果。(sqlCopy 将查询发送到数据库并将结果保存为数据库中的表。) 通过首先调用 odbcQuery 然后调用 sqlGetResults 来获取结果,可以获得更精细的控制。后者可以在循环中使用,以一次检索有限数量的行,就像函数 sqlFetchMore 一样。
以下是一个使用 PostgreSQL 的示例,其中 ODBC 驱动程序将列名和数据框名称映射为小写。我们使用之前创建的数据库 testdb,并在 ~/.odbc.ini 中的 unixODBC 下设置了 DSN(数据源名称)。完全相同的代码在使用 MyODBC 访问 Linux 或 Windows 下的 MySQL 数据库时也能正常工作(其中 MySQL 也将名称映射为小写)。在 Windows 下,DSN 在控制面板中的 ODBC 小程序中设置(在“管理工具”部分中的“数据源 (ODBC)”)。
> library(RODBC)
## tell it to map names to l/case
> channel <- odbcConnect("testdb", uid="ripley", case="tolower")
## load a data frame into the database
> data(USArrests)
> sqlSave(channel, USArrests, rownames = "state", addPK = TRUE)
> rm(USArrests)
## list the tables in the database
> sqlTables(channel)
TABLE_QUALIFIER TABLE_OWNER TABLE_NAME TABLE_TYPE REMARKS
1 usarrests TABLE
## list it
> sqlFetch(channel, "USArrests", rownames = "state")
murder assault urbanpop rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
...
## an SQL query, originally on one line
> sqlQuery(channel, "select state, murder from USArrests
where rape > 30 order by murder")
state 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
## remove the table
> sqlDrop(channel, "USArrests")
## close the connection
> odbcClose(channel)
作为在 Windows 下使用 ODBC 和 Excel 电子表格的简单示例,我们可以通过以下方式从电子表格中读取数据:
> library(RODBC)
> channel <- odbcConnectExcel("bdr.xls")
## list the spreadsheets
> sqlTables(channel)
TABLE_CAT TABLE_SCHEM TABLE_NAME TABLE_TYPE REMARKS
1 C:\\bdr NA Sheet1$ SYSTEM TABLE NA
2 C:\\bdr NA Sheet2$ SYSTEM TABLE NA
3 C:\\bdr NA Sheet3$ SYSTEM TABLE NA
4 C:\\bdr NA Sheet1$Print_Area TABLE NA
## retrieve the contents of sheet 1, by either of
> sh1 <- sqlFetch(channel, "Sheet1")
> sh1 <- sqlQuery(channel, "select * from [Sheet1$]")
请注意,表的规范与 sqlTables 返回的名称不同:sqlFetch 能够映射这些差异。