R訪問資料庫管理系統(通過RODBC包和RMySQL包兩種方式)

R中有多種面向關係型資料庫管理系統(DBMS)的介面,包括SQL Server、Access、MySQL、Oracle、DB2等。其中一些包通過原生的資料庫驅動來提供訪問功能,另一些則是通過ODBC或JDBC來實現訪問的。使用R來訪問存儲在外部資料庫中的數據是一種分析大數據集的有效手段,並且能夠發揮SQL和R。

一種方式是依賴RODBC包,該包使用開放資料庫連接(Open Database Connectivity,ODBC)驅動作為一種連接到DBMS的方法,這就要求用戶必須先安裝和配置必要的驅動程序,然後才能在R中使用它。在不同平台和很多有種DBMS都有可用的ODBC驅動程序。它們甚至還能針對根本不是資料庫的數據存儲格式,如CSV或XLS/XLSX。該組件也提供了一套通用方法,利用同一組函數來管理不同類型的資料庫。該方法不足的一面是,它依賴在R運行的平台上是否有能與特定DBMS類型配套的ODBC驅動程序。另一種方式是使用DBI(R Special Interest Group on Databases 2013)的組件,例如RMySQL、ROracle、RPostgreSQL和RSQlite。通過它建立到特定DBMS的「本地」鏈接。DBI組件定義了虛擬函數,而針對特定資料庫的組件則針對具體資料庫實現了這些函數。這樣雖然有一些通用函數集對所有資料庫都是同樣有效的,而不同的組件作者可以只針對一種類型的資料庫進行有針對性的開發和維護工作。

到底使用哪種方式實現R訪問資料庫管理系統,這純粹依賴於你個人的習慣。接下來,讓我們在Windows系統下演示通過RODBC包和RMySQL包實現連接32位MySQL,並對資料庫進行查表、插入表和刪除表等的操作。

方式一:通過RODBC包訪問32位MySQL資料庫

MySQL的安裝非常簡單(mysql-5.5.28-win32.msi),此處就不再贅述。安裝完成後,我們測試下是否安裝成功。打開MySQL 5.5 Command Line Client窗口,輸入你安裝MySQL時設置的密碼,即可登錄MySQL。如下截圖所示:

輸入show databases命令查看目前已有的資料庫。

假如我們想進入mysql資料庫,利用利用usemysql命令;想查看mysql資料庫中有哪些表,可以show tables命令。

現在,讓我們輸入status命令查看安裝的MySQL版本。

可見,我計算機安裝的是32位的MySQL(為了與伺服器上的MySQL版本一致)。此時,我們需要調出32位的ODBC數據源管理器來配置MySQL驅動。由於本機計算機安裝的64位的Win 7,所以控制面板中的ODBC數據源管理器也是64位的,我們需要在C:WindowsSysWOW64文件夾下找到odbcad32.exe,雙擊打開ODBC數據源管理器界面。

點擊添加,得到以下窗口,選擇MySQL驅動:

如果找不到MySQL驅動,下載mysql-connector-odbc-5.3.6-win32.msi雙擊進行安裝即可。選擇MySQL驅動點擊完成後得到的窗口如下:

其中Data Source Name可以填寫你自己喜歡的名稱(這邊假設設置為daniel),Description可填可不填,TCPIP Server是你要連接的MySQL資料庫IP地址,如果是你本機計算機,可填寫localhost,Port默認埠號是3306,User和Password是登錄MySQL的賬號和密碼,Database是需要連接MySQL中的那個資料庫。設置完成後,點擊Test按鈕驗證是否配置OK。

出現ConnectionSuccessful,說明驅動配置成功。接下來,我們就需要在R中安裝RODBC包(通過install.packages(「RODBC」)),實現R訪問資料庫管理系統。大家需要注意一點,如果你們是64位的計算機,安裝R時默認是安裝32位和64位兩個版本的,此時需要在32位的R中安裝RODBC包。

包下載安裝好後,就可以利用包中的odbcConnect(dsn, uid = "", pwd = "", ...)函數進行資料庫連接,並繼續數據的傳輸及分析工作。

>library(RODBC)

> channel <-odbcConnect("daniel","root","123456")

> channel

RODBC Connection 1

Details:

case=tolower

DSN=daniel

UID=root

PWD=******

可以通過odbcGetInfo命令查看連接資料庫的詳細信息。

假如想把R中的mtcars數據集保存到MySQL中,可以通過sqlSave命令實現。第一個參數channel是建立的鏈接,第二個參數dat是指R中的數據集,第三個參數tablename是指MySQL中的表明,append參數是邏輯值,默認為FALSE表示建立新表(如果表明已經存在則會報錯),TRUE表示在已有表中插入新數據。

我們現在MySQL輸入desc mydata命令查看錶mydata的數據結構,並通過SQL語句查看行數。

可見,表mydata已經存在,且有32條記錄。我們在R中運行以下命令:

sqlSave(channel,mtcars,"mydata",append= FALSE)

此時報錯,錯誤原因就是將append參數設置為FALSE,提示MySQL中mydata表已經存在。

我們將append參數設置為TRUE再次嘗試。

行數比之前多了一倍,證明數據已經在後面追加成功。

現在,我們在R中利用sqlDrop命令將MySQL中的表mydata刪除。運行以下命令

sqlDrop(channel,"mydata")

回到MySQL中,通過SQL語句查看錶mydata的前六行:

錯誤提示說明表mydata不存在。

再次運行sqlSave(channel,mtcars,"mydata",append= FALSE)命令重新將mtcars數據集保存到MySQL中,生成新表mydata。現在我們在R中利用sqlFetch命令和sqlQuery命令進行MySQL表的提取和SQL語句查詢。

好了,常用的一些函數功能已經介紹了,最後,大家別忘記通過odbcClose命令關閉連接。

>odbcClose(channel)

>odbcGetInfo(channel)

Error inodbcGetInfo(channel) : argument is not an open RODBC channel

方式二:通過RMySQL包訪問32位MySQL資料庫

此處還是以Windows為例進行演示(linux系統類似)。RMySQL包的安裝非常簡單,不需要配置ODBC數據源管理器,直接在R中通過install.packages(「RMySQL」)語句進行安裝。

安裝完成後,通過dbConnect命令建立R與MySQL資料庫的連接。

通過dbListTables命令查看連接資料庫中的表名。

通過dbListFields命令查看某個表的欄位。

有時候,大家可能會遇到利用RMySQL包讀取MySQL中數據是出現中文亂碼問題。比如我的MySQL中有一個叫revenue的表,收錄了一些遊戲收入的數據。

可見,中文已經正常顯示。

好了,已經非常詳細介紹了RODBC包和RMySQL包的安裝及用法,大家可以根據自己的習慣選擇包來進行嘗試。

--------------

作者:謝佳標

博客專欄:謝佳標的博客專欄

視頻教程推薦:數據分析與挖掘R語言十三式,打造R全棧專家!涵蓋R語言入門、數據可視化、數據挖掘演算法模型、企業級實戰、精選行業案例 數據分析與挖掘R語言十三式,打造R全棧專家

大家也可以加小編微信:tswenqu(備註:知乎),進R語言中文社區 交流群,可以跟各位老師互相交流

官方公眾號:R語言中文社區 (ID:R_shequ) 歡迎關注,持續連載。

推薦閱讀:

寫一個資料庫最難的地方在哪?最精華的地方在哪?分幾步?
圖解 SQL 里的各種 JOIN
华为自研的数据库gaussdb怎么样?
日後想在資料庫方面發展,需要有哪些必備的技能?

TAG:R编程语言 | MySQL | 数据库 |