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安裝,參照上一篇關于liunx下安裝mysql的文章。
1. 安裝RMySQL包
在裝RMySQL包之前,確定電腦上裝了libmysqlclient-dev,否則在安裝時會出現錯誤。
~$ sudo apt-get install libmysqlclient-dev #安裝客戶端的開發支持
~$ R
> install.packages("RMySQL","/home/beili/R/packages") #安裝RMySQL包
> .libPaths(RMySQL)
2.RMySQL支持的相關函數
輔助函數
2.1 dbConnect,dbDisconnect #數據庫連接函數
2.2 dbListFields ,dbListTables,dbGetInfo,dbListResults,summary,dbGetException,dbExistsTable #查看數據庫或者參數信息
查詢函數
2.3 dbGetQuery #查詢函數
2.4 dbReadTable #讀取表的數據
更新函數
2.5 dbWriteTable #創建數據庫表或者將數據寫入對應的表
2.6 dbRemoveTable # 刪除數據庫中的表
dbSendQuery函數
2.7 dbSendQuery ,dbClearResult #將query交給數據庫引擎
2.8 dbColumnInfo,dbGetRowsAffected,dbGetRowCount,dbHasCompleted #查看數據庫引擎執行結果
2.9 dbFetch,fetch #將dbSendQuery函數的結果抽取出來
2.10 dbNextResult,dbMoreResults #一條一條讀取結果
事務函數
2.11 dbCommit,dbBegin,dbRollback
2.1 dbConnect和dbDisconnect函數
函數調用格式如下:
dbConnect(drv, dbname,username,password ,host,port,client.flag=CLIENT_MULTI_STATEMENTS..)
dbDisconnect(conn, ...)
注:client.flag=CLIENT_MULTI_STATEMENTS表示客戶端允許執行多個statement。
由于和傳統的設置參數差不多,所以下面直接看例子:
> 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) #關閉連接
注:本地連接不用設置host和port,另外summary屬于RMySQL的函數,是S4類,用戶mysql驅動的信息
2.2 dbListFields ,dbListTables,dbGetInfo,dbListResults,summary,dbGetException查看數據庫或者參數信息
函數調用格式如下:
dbListFields(conn, name, ...) #查看表的字段信息
dbListTables(conn, ...) #查看數據庫下表
dbGetInfo(dbObj, what = "", ...) #獲取mysql數據變量的信息,what指定得到list中的哪個值
dbListResults(conn, ...) #列出conn的查詢結果
summary(object, verbose = FALSE, ...)#查看某個變量的相信信息
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 數據庫查詢
dbGetQuery實際要執行一連串的動作,在內部實際上會執行dbSendQuery函數,然后當dbHasCompleted為TRUE之后,又自動fetch出返回的結果,最后由on.exit保證執行dbClearResult。該函數支持各種各樣的query,當執行select操作時,返回data.frame類型的結果;當執行insert/update操作時,返回NULL。
函數調用格式:
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 讀取整個表的數據
調用格式:
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 將數據寫入數據庫
調用格式:
dbWriteTable(conn, name, value, row.names=T,overwrite,append,...)
其中row.names表示是否將row.names寫入數據庫的,作為單獨的一列;overwrite=T表示會覆蓋掉原先的數據;append=T表示在原先的數據后面進行插入。
例子:
> dbGetQuery(conn,"truncate table stu")
NULL
> dbReadTable(conn,"stu",row.names=1)
[1] stuid name age<0行>(或0-長度的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? 刪除表實際上執行了“Drop table name”的命令,在2.3中給出了drop的例子。
調用格式:
dbRemoveTable(conn,name)
例子:
> dbListTables(conn)
[1] "people" "stu"
> dbRemoveTable(conn,"people")
[1] TRUE
> dbListTables(conn)
[1] "stu"
2.7 dbSendQuery ,dbClearResult
dbSendQuery函數提交查詢,并在服務器那端同步執行,但是并不抽取其中的結果,因此需要配合dbFetch來使用,最后抽取完畢之后,使用dbClearResult來清洗返回的結果。既然有了dbReadTable函數了,為什么還要有dbSendQuery呢?如果需要返回的數據很大的情況下,而R又裝不下,如果使用dbReadTable那么鐵定不行了。dbSendQuery函數來說,DBMS執行了query語句,可能生成了大量的數據,不同的數據庫驅動可能有不同的處理方式,有的存儲在服務器端,一點一點發給R;有的傳給客戶端,但是不會一下子傳給R。
dbClearResult函數釋放占用的資源。
調用格式:
dbSendQuery(conn, statement)
dbClearResult(res, ...)
如果dbConnect中client.flag沒有設置下,只能執行一條statement,而且不dbClearResult執行的res是不能再執行dbSendQuery函數的,也就是說正確的執行方式如下:
rs1=dbSendQuery(conn, statement)
...
dbClearResult(rs1, ...)
rs2=dbSendQuery(conn, statement)
...
dbClearResult(rs2, ...)
而下面的調用格式是錯的:
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")
錯誤于.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
這一系列的函數,其實是dbSendQuery的輔助函數,得到的信息,使用dbGetInfo(res)都能得到。
重點說一下dbHasCompleted函數,函數含義是服務器端的數據是否被抽取完畢:
調用格式:
dbHasCompleted(res,...)
注:只有查詢的數據全部被R抽取完,該函數才能返回TRUE值,具體使用見2.9中的例子。
2.9 dbFetch,fetch
fetch是比較老的一個版本,dbFetch和fetch功能相同,不過比較鼓勵使用dbFetch。
調用格式:
dbFetch(res,n,...)
ftch(res,n,)
注:n表示讀取的行數,當n=-1時,表示全部抽取。
例子:
> 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是針對多個query statement來說的,如果還有額外的結果集需要處理,則返回TRUE,否則返回FALSE
dbNextResult 接著處理下一個statement的結果集。
調用格式:
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
三個事務函數,和數據庫中的概念是一致的。
調用方式:
dbBegin(conn, ...)
dbCommit(conn, ...)
dbRollback(conn, ...)