mysql r_R之RMySQL
linux,mysql和R的版本信息:
Linux naci 3.19.0-16-generic #16-Ubuntu SMP
Server version: 5.6.24-0ubuntu2 (Ubuntu)
R version 3.1.2 (2014-10-31) -- "Pumpkin Helmet"
mysql的linux安裝,參照上一篇關(guān)于liunx下安裝mysql的文章。
1. 安裝RMySQL包
在裝RMySQL包之前,確定電腦上裝了libmysqlclient-dev,否則在安裝時(shí)會(huì)出現(xiàn)錯(cuò)誤。
~$ sudo apt-get install libmysqlclient-dev #安裝客戶(hù)端的開(kāi)發(fā)支持
~$ R
> install.packages("RMySQL","/home/beili/R/packages") #安裝RMySQL包
> .libPaths(RMySQL)
2.RMySQL支持的相關(guān)函數(shù)
輔助函數(shù)
2.1 dbConnect,dbDisconnect #數(shù)據(jù)庫(kù)連接函數(shù)
2.2 dbListFields ,dbListTables,dbGetInfo,dbListResults,summary,dbGetException,dbExistsTable #查看數(shù)據(jù)庫(kù)或者參數(shù)信息
查詢(xún)函數(shù)
2.3 dbGetQuery #查詢(xún)函數(shù)
2.4 dbReadTable #讀取表的數(shù)據(jù)
更新函數(shù)
2.5 dbWriteTable #創(chuàng)建數(shù)據(jù)庫(kù)表或者將數(shù)據(jù)寫(xiě)入對(duì)應(yīng)的表
2.6 dbRemoveTable # 刪除數(shù)據(jù)庫(kù)中的表
dbSendQuery函數(shù)
2.7 dbSendQuery ,dbClearResult #將query交給數(shù)據(jù)庫(kù)引擎
2.8 dbColumnInfo,dbGetRowsAffected,dbGetRowCount,dbHasCompleted #查看數(shù)據(jù)庫(kù)引擎執(zhí)行結(jié)果
2.9 dbFetch,fetch #將dbSendQuery函數(shù)的結(jié)果抽取出來(lái)
2.10 dbNextResult,dbMoreResults #一條一條讀取結(jié)果
事務(wù)函數(shù)
2.11 dbCommit,dbBegin,dbRollback
2.1 dbConnect和dbDisconnect函數(shù)
函數(shù)調(diào)用格式如下:
dbConnect(drv, dbname,username,password ,host,port,client.flag=CLIENT_MULTI_STATEMENTS..)
dbDisconnect(conn, ...)
注:client.flag=CLIENT_MULTI_STATEMENTS表示客戶(hù)端允許執(zhí)行多個(gè)statement。
由于和傳統(tǒng)的設(shè)置參數(shù)差不多,所以下面直接看例子:
> conn=dbConnect(MySQL(),dbname="test",username="root",password="mdcl") #建立連接
> summary(conn,verbose=T) #查看連接信息
<0> User: root0>
Host: localhost
Dbname: test
Connection type: Localhost via UNIX socket
MySQL server version: 5.6.24-0ubuntu2
MySQL client version: 5.6.24
MySQL protocol version: 10
MySQL server thread id: 4
Results:
> dbDisconnect(conn) #關(guān)閉連接
注:本地連接不用設(shè)置host和port,另外summary屬于RMySQL的函數(shù),是S4類(lèi),用戶(hù)mysql驅(qū)動(dòng)的信息
2.2 dbListFields ,dbListTables,dbGetInfo,dbListResults,summary,dbGetException查看數(shù)據(jù)庫(kù)或者參數(shù)信息
函數(shù)調(diào)用格式如下:
dbListFields(conn, name, ...) #查看表的字段信息
dbListTables(conn, ...) #查看數(shù)據(jù)庫(kù)下表
dbGetInfo(dbObj, what = "", ...) #獲取mysql數(shù)據(jù)變量的信息,what指定得到list中的哪個(gè)值
dbListResults(conn, ...) #列出conn的查詢(xún)結(jié)果
summary(object, verbose = FALSE, ...)#查看某個(gè)變量的相信信息
dbGetException(conn, ...) #查看conn的異常信息
dbExistsTable(conn, name, ...)
例如:
> dbListFields(conn,"people")
[1] "name" "sex" "age"
> dbListTables(conn)
[1] "people"
> dbGetInfo(conn)
$host
[1] "localhost"
$user
[1] "root"
$dbname
[1] "test"
...
> dbListResults(conn)
list()
> dbGetException(conn)
$errorNum
[1] 0
$errorMsg
[1] ""
> dbExistsTable(conn, "people")
[1] TRUE
2.3 dbGetQuery 數(shù)據(jù)庫(kù)查詢(xún)
dbGetQuery實(shí)際要執(zhí)行一連串的動(dòng)作,在內(nèi)部實(shí)際上會(huì)執(zhí)行dbSendQuery函數(shù),然后當(dāng)dbHasCompleted為T(mén)RUE之后,又自動(dòng)fetch出返回的結(jié)果,最后由on.exit保證執(zhí)行dbClearResult。該函數(shù)支持各種各樣的query,當(dāng)執(zhí)行select操作時(shí),返回data.frame類(lèi)型的結(jié)果;當(dāng)執(zhí)行insert/update操作時(shí),返回NULL。
函數(shù)調(diào)用格式:
dbGetQuery(conn, statement, ...)
例子:
> res=dbGetQuery(conn,"select * from people")
> class(res)
[1] "data.frame"
> res
name sex age
1 bao M 12
2 qiao M 12
> dbGetQuery(conn,"show tables")
Tables_in_test
1???????? people
2??????????? stu
3??????? student
> dbGetQuery(conn,"drop table student")
NULL
> dbGetQuery(conn,"show tables")
Tables_in_test
1???????? people
2??????????? stu
2.4 dbReadTable 讀取整個(gè)表的數(shù)據(jù)
調(diào)用格式:
dbReadTable(conn, name, row.names,check.names = TRUE, ...)
其中 row.names=k,表示第k列作為每一行的名字。
例子:
> dbReadTable(conn,"stu",row.names=1)
stuid name age
1 1 qiao 51
2 2 bao 27
3 3 qiao 1
4 4 bao 26
2.5 dbWriteTable 將數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)
調(diào)用格式:
dbWriteTable(conn, name, value, row.names=T,overwrite,append,...)
其中row.names表示是否將row.names寫(xiě)入數(shù)據(jù)庫(kù)的,作為單獨(dú)的一列;overwrite=T表示會(huì)覆蓋掉原先的數(shù)據(jù);append=T表示在原先的數(shù)據(jù)后面進(jìn)行插入。
例子:
> dbGetQuery(conn,"truncate table stu")
NULL
> dbReadTable(conn,"stu",row.names=1)
[1] stuid name age<0行>(或0-長(zhǎng)度的row.names)
> dbWriteTable(conn,"stu",student,append=T)
[1] TRUE
> dbReadTable(conn,"stu",row.names=1)
stuid name age
1 1 qiao 51
2 2 bao 27
3 3 qiao 1
4 4 bao 26
2.6 dbRemoveTable? 刪除表實(shí)際上執(zhí)行了“Drop table name”的命令,在2.3中給出了drop的例子。
調(diào)用格式:
dbRemoveTable(conn,name)
例子:
> dbListTables(conn)
[1] "people" "stu"
> dbRemoveTable(conn,"people")
[1] TRUE
> dbListTables(conn)
[1] "stu"
2.7 dbSendQuery ,dbClearResult
dbSendQuery函數(shù)提交查詢(xún),并在服務(wù)器那端同步執(zhí)行,但是并不抽取其中的結(jié)果,因此需要配合dbFetch來(lái)使用,最后抽取完畢之后,使用dbClearResult來(lái)清洗返回的結(jié)果。既然有了dbReadTable函數(shù)了,為什么還要有dbSendQuery呢?如果需要返回的數(shù)據(jù)很大的情況下,而R又裝不下,如果使用dbReadTable那么鐵定不行了。dbSendQuery函數(shù)來(lái)說(shuō),DBMS執(zhí)行了query語(yǔ)句,可能生成了大量的數(shù)據(jù),不同的數(shù)據(jù)庫(kù)驅(qū)動(dòng)可能有不同的處理方式,有的存儲(chǔ)在服務(wù)器端,一點(diǎn)一點(diǎn)發(fā)給R;有的傳給客戶(hù)端,但是不會(huì)一下子傳給R。
dbClearResult函數(shù)釋放占用的資源。
調(diào)用格式:
dbSendQuery(conn, statement)
dbClearResult(res, ...)
如果dbConnect中client.flag沒(méi)有設(shè)置下,只能執(zhí)行一條statement,而且不dbClearResult執(zhí)行的res是不能再執(zhí)行dbSendQuery函數(shù)的,也就是說(shuō)正確的執(zhí)行方式如下:
rs1=dbSendQuery(conn, statement)
...
dbClearResult(rs1, ...)
rs2=dbSendQuery(conn, statement)
...
dbClearResult(rs2, ...)
而下面的調(diào)用格式是錯(cuò)的:
rs1=dbSendQuery(conn, statement)
rs2=dbSendQuery(conn, statement)
...
dbClearResult(rs1, ...)
dbClearResult(rs2, ...)
例子:
> res=dbSendQuery(conn,"select * from stu")
> dbGetInfo(res)
$statement
[1] "select * from stu"
$isSelect
[1] 1
$rowsAffected
[1] -1
$rowCount
[1] 0
$completed
[1] 0
$fieldDescription
$fieldDescription[[1]]
NULL
> res2=dbSendQuery(conn,"select * from stu")
錯(cuò)誤于.local(conn, statement, ...) :
connection with pending rows, close resultSet before continuing
> dbClearResult(res)
[1] TRUE
> res2=dbSendQuery(conn,"select * from stu")
2.8 dbColumnInfo,dbGetRowsAffected,dbGetRowCount,dbHasCompleted
這一系列的函數(shù),其實(shí)是dbSendQuery的輔助函數(shù),得到的信息,使用dbGetInfo(res)都能得到。
重點(diǎn)說(shuō)一下dbHasCompleted函數(shù),函數(shù)含義是服務(wù)器端的數(shù)據(jù)是否被抽取完畢:
調(diào)用格式:
dbHasCompleted(res,...)
注:只有查詢(xún)的數(shù)據(jù)全部被R抽取完,該函數(shù)才能返回TRUE值,具體使用見(jiàn)2.9中的例子。
2.9 dbFetch,fetch
fetch是比較老的一個(gè)版本,dbFetch和fetch功能相同,不過(guò)比較鼓勵(lì)使用dbFetch。
調(diào)用格式:
dbFetch(res,n,...)
ftch(res,n,)
注:n表示讀取的行數(shù),當(dāng)n=-1時(shí),表示全部抽取。
例子:
> dbWriteTable(conn, "mtcars", mtcars)
[1] TRUE
> res
> dbFetch(res)
row_names mpg cyl disp hp drat wt qsec vs am gear carb
1 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
2 Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
3 Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
4 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
5 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
6 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
7 Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
8 Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
9 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
10 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
11 Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
> dbClearResult(res)
[1] TRUE
>res
> while (!dbHasCompleted(res)) {
+ chunk
+ print(nrow(chunk))
+ }
[1] 10
[1] 10
[1] 10
[1] 2
> dbClearResult(res)
[1] TRUE
2.10 dbNextResult,dbMoreResults
dbMoreResults是針對(duì)多個(gè)query statement來(lái)說(shuō)的,如果還有額外的結(jié)果集需要處理,則返回TRUE,否則返回FALSE
dbNextResult 接著處理下一個(gè)statement的結(jié)果集。
調(diào)用格式:
dbNextResult(con, ...)
dbMoreResult(con,...)
例子:
> con=dbConnect(MySQL(),dbname="test",username="root",password="mdcl",client.flag=CLIENT_MULTI_STATEMENTS)
> dbListTables(con)
[1] "mtcars" "stu"
> sql
> rs1
> dbFetch(rs1, n = -1)
cyl
1?? 6
2?? 6
3?? 4
4?? 6
5?? 8
>? if (dbMoreResults(con)) {
+???????? rs2
+???????? dbFetch(rs2, n = -1)
+????? }
vs
1? 0
2? 0
3? 1
4? 1
5? 0
>?dbClearResult(rs1)
[1] TRUE
>? dbClearResult(rs2)
[1] TRUE
2.11 dbCommit ,dbBegin,dbRollback
三個(gè)事務(wù)函數(shù),和數(shù)據(jù)庫(kù)中的概念是一致的。
調(diào)用方式:
dbBegin(conn, ...)
dbCommit(conn, ...)
dbRollback(conn, ...)
總結(jié)
以上是生活随笔為你收集整理的mysql r_R之RMySQL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 工况密度和标况密度怎么换算_什么是载流量
- 下一篇: linux cmake编译源码,linu