<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RODBC on 格物堂</title><link>https://gewutang.cn/tags/rodbc/</link><description>Recent content in RODBC on 格物堂</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 19 May 2014 00:00:00 +0000</lastBuildDate><atom:link href="https://gewutang.cn/tags/rodbc/index.xml" rel="self" type="application/rss+xml"/><item><title>R数据库交互系列笔记：DBI包</title><link>https://gewutang.cn/2014/05/19/notes-on-dbi/</link><pubDate>Mon, 19 May 2014 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2014/05/19/notes-on-dbi/</guid><description>&lt;p&gt;DBI是DataBase Interface的简称，即数据库界面。这篇笔记的主要内容是讲一讲如何用R中的DBI包来与常见数据库进行交互。&lt;/p&gt;&#10;&lt;h3 id="1-简介"&gt;&lt;a href="#1-%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;1 简介&#10;&lt;/h3&gt;&lt;p&gt;DBI定义了一个与RDBMS类型数据库进行通信的泛型接口，对于任意一个RDBMS，DBI都会有一个兼容的数据库驱动来实现对接。目前，其可用的驱动包括Oracle、MySQL和SQLite等。&lt;/p&gt;&#10;&lt;p&gt;理论上说，DBI的泛型接口允许我们同样的代码来跟不同的RDBMS进行通信。但实际应用的时候，还要看具体的RDBMS与SQL标准的是否完全相似，以及数据库开发者开发过程中是否避免使用RDBMS特有的一些功能。&lt;/p&gt;&#10;&lt;p&gt;下面以SQLite数据库为例说明一下。例子中用的是Affymetrix hgu95av2的微阵列芯片数据，用之前先加载相关的包。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;library(tools)&#10;library(&amp;quot;RBioinf&amp;quot;)&#10;library(&amp;quot;DBI&amp;quot;)&#10;library(&amp;quot;RSQLite&amp;quot;)&#10;dbPath &amp;lt;- &amp;quot;hgu95av2-sqlite.db&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="2-dbi连接sqlite数据库"&gt;&lt;a href="#2-dbi%e8%bf%9e%e6%8e%a5sqlite%e6%95%b0%e6%8d%ae%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;2 DBI连接SQLite数据库&#10;&lt;/h3&gt;&lt;p&gt;DBI连接RDBMS需要两步。第一步，用dbDriver函数创建一个适合的数据库驱动；第二步，用dbConnect函数创建数据库连接。具体到SQLite，只需要指定包含数据库的文件夹路径即可。而对于MySQL或者Oracle，则需要指定主机地址、用户名和密码等信息。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;drv &amp;lt;- dbDriver(&amp;quot;SQLite&amp;quot;)&#10;db &amp;lt;- dbConnect(drv, dbPath)&#10;db&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;dbDisconnect函数可以断开连接。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;dbDisconnect(db)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="3-查询数据库结构"&gt;&lt;a href="#3-%e6%9f%a5%e8%af%a2%e6%95%b0%e6%8d%ae%e5%ba%93%e7%bb%93%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;3 查询数据库结构&#10;&lt;/h3&gt;&lt;p&gt;可以用dbListTables和dbListFields函数来列出数据库中的表名以及各表对应的字段（列名）。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;db &amp;lt;- dbConnect(drv, dbPath)&#10;dbListTables(db)&#10;dbListFields(db, &amp;quot;go_probe&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="4-查询语句"&gt;&lt;a href="#4-%e6%9f%a5%e8%af%a2%e8%af%ad%e5%8f%a5" class="header-anchor"&gt;&lt;/a&gt;4 查询语句&#10;&lt;/h3&gt;&lt;p&gt;dbSendQuery函数可以执行任意SQL语句。返回的结果是DBI结果的子类，这个子类的结果可以用fetch函数来查询。为了节约内存，用不到的数据库查询对象可以用dbClearResult函数进行清除。&lt;/p&gt;&#10;&lt;p&gt;fetch函数可以将查询结果转为数据框。dbColumnInfo、dbGetRowsAffected和dbGetRowCount函数可以返回更多关于查询的信息。下面分别演示。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;sql &amp;lt;- &amp;quot;select affy_id, evi from go_probe&amp;quot;&#10;rs &amp;lt;- dbSendQuery(db, sql)&#10;rs&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;DBIResult实例包含了查询的相关信息。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;dbColumnInfo(rs)&#10;dbGetStatement(rs)&#10;dbGetRowsAffected(rs)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;具体的结果可用fetch函数查看。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;chunk &amp;lt;- fetch(rs, n = 5)&#10;chunk&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;dbGetRowCount函数范围所有查询结果的行数。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;dbGetRowCount(rs)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;当不再用某个DBIResult实例时，记得清除。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;dbClearResult(rs)&#10;rs&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="5-基于查询结果构建r中的数据对象"&gt;&lt;a href="#5-%e5%9f%ba%e4%ba%8e%e6%9f%a5%e8%af%a2%e7%bb%93%e6%9e%9c%e6%9e%84%e5%bb%bar%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae%e5%af%b9%e8%b1%a1" class="header-anchor"&gt;&lt;/a&gt;5 基于查询结果构建R中的数据对象&#10;&lt;/h3&gt;&lt;pre&gt;&lt;code class="language-r"&gt;sql &amp;lt;- &amp;quot;select * from go_probe&amp;quot;&#10;rs &amp;lt;- dbSendQuery(db, sql)&#10;dat &amp;lt;- fetch(rs, n = 500)&#10;goList &amp;lt;- split(dat$go_id, dat$affy_id)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="6-odbc"&gt;&lt;a href="#6-odbc" class="header-anchor"&gt;&lt;/a&gt;6 ODBC&#10;&lt;/h3&gt;&lt;p&gt;RODBC包可以连接ODBC数据源，当然前提是安装相应的数据库驱动。R导入与导出中给出了一些使用RODBC的实例，可以供参考。用ODBC连接RDBMS时，需要指定一个ODBC数据服务，具体如何做要看所用的操作系统。&lt;/p&gt;&#10;&lt;p&gt;RBioinf包中提供Gavin和Ho提供关于AP-MS蛋白质实验结果数据，分别给出了pcomplex.txt和pcomplex.xls两种格式，下面用它来演示下RODBC的用法。&lt;/p&gt;&#10;&lt;p&gt;数据包括三列：bait-protein，experiment和prey-protein。下面的结果仅在Windows系统下才能重现。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;library(&amp;quot;RODBC&amp;quot;)&#10;if (.Platform$OS.type == &amp;quot;Windows&amp;quot;) {&#10; pcomplexXls &amp;lt;- system.file(&amp;quot;extdata/pcomplex.xls&amp;quot;, package = &amp;quot;RBioinf&amp;quot;)&#10; db &amp;lt;- odbcConnectExcel(pcomplexXls)&#10; }&#10;if (!is.null(db)) {&#10; sqlTables(db)&#10; sqlQuery(db, &amp;quot;select * from [Sheet1$] limit 5&amp;quot;)&#10; }&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="7-参考文献"&gt;&lt;a href="#7-%e5%8f%82%e8%80%83%e6%96%87%e7%8c%ae" class="header-anchor"&gt;&lt;/a&gt;7 参考文献&#10;&lt;/h3&gt;&lt;p&gt;Seth Falcon，How to Use DBI: Connecting to Databases with R，January 17, 2006。&lt;/p&gt;&#10;</description></item></channel></rss>