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安装,参照上一篇关于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) #查看连接信息
<MySQLConnection:0,0>
User: root
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 <- dbSendQuery(conn, "SELECT * FROM mtcars WHERE cyl = 4")
> 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 <- dbSendQuery(conn, "SELECT * FROM mtcars")
> while (!dbHasCompleted(res)) {
+ chunk <- fetch(res, 10)
+ 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 <- "SELECT cyl FROM mtcars LIMIT 5; SELECT vs FROM mtcars LIMIT 5"
> rs1 <- dbSendQuery(con, sql)
> dbFetch(rs1, n = -1)
cyl
1 6
2 6
3 4
4 6
5 8
> if (dbMoreResults(con)) {
+ rs2 <- dbNextResult(con)
+ 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, ...)
R之RMySQL的更多相关文章
- R语言连接MYSQL
操作系统:centos 6.4 64bit R语言可以使用RMySQL来连接Mysql数据库,直接使用数据库里面的数据生成图像. 这个是RMYSQL的说明: http://cran.r-project ...
- R语言文件相关的操作
1. 文件系统介绍 R语言对文件系统的操作,包括文件操作和目录操作,函数API都定义在base包中. 2. 目录操作 2.1 查看目录 查看当前目录下的子目录. # 启动R程序 ~ R # 当前的目录 ...
- RMySQL数据库编程指南
R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器.随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长.现在已不仅仅是统计领域,教 ...
- R8—批量生成文件夹,批量读取文件夹名称+R文件管理系统操作函数
一. 批量生成文件夹,批量读取文件夹名称 今日,工作中遇到这样一个问题:boss给我们提供了200多家公司的ID代码(如6007.7920等),需要根据这些ID号去搜索下载新闻,从而将下载到的新闻存到 ...
- R语言中的MySQL操作
R语言中,针对MySQL数据库的操作执行其实也有很多中方式.本人觉得,熟练掌握一种便可,下面主要就个人的学习使用情况,总结其中一种情况-----使用RMySQL操作数据库. 1.下载DBI和RMySQ ...
- 在R语言中封装类读写sql操作工具类
1.mysql_helper.R # 使用RMySQL操作数据库 # 载入DBI和RMySQL包 library(DBI) library(RMySQL) mysql_con <- functi ...
- R中实现脚本调用,以及函数调用
R中实现脚本调用,以及函数调用 这里的列子是test.R调用mysql_con.R中的函数 mysql_con.R # 使用RMySQL操作数据库 # 载入DBI和RMySQL包 #library(D ...
- 使用RMySQL连接MySQL数据库(R-3.4.3)
1.安装DBI和RMySQL包(安装RMySQL时会依赖安装DBI) install.packages("RMySQL") 2.编写R脚本test.R # 使用RMySQL操作数据 ...
- 转】RMySQL数据库编程指南
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! Posted: Sep 24, 2013 Ta ...
随机推荐
- 一次tomcat的调优记录
项目本身需要上传模型,使用的是springboot1.5.3. 上传的模型比较大,下载的过程中就出现了问题(下载是su调用的java接口,其开发并非本人负责,不可更改) 问题在于,下载的时候tomca ...
- c#使用emit方法DB,实体相互转换
网上有很多ORM框架和数据库转换方法. c#由EF控制,但是大家知道的是影响效率和底层控制. 因此最近几个月一直在研究.最后产出了Hikari数据库连接池. 但是该库只是定位在连接池,无法有效进行后续 ...
- 笔记:css中的position定位
position的值可以是:static,relative,absolute,fixed. 默认值是 static.设置 left.top值无效. relative是相对定位,可以设置left.top ...
- 十个常见的Java异常出现原因
异常是 Java 程序中经常遇到的问题,我想每一个 Java 程序员都讨厌异常,一 个异常就是一个 BUG,就要花很多时间来定位异常问题. 1.NullPointerException 空指针异常,操 ...
- PG 存储函数调用变量的3种方法。
一.假设有表student,字段分别有id,remark,name等字段. 二.写一个存储函数,根据传过去的变量ID更新remark的内容. 调用该存储函数格式如下:select update_st ...
- Vim Go开发环境搭建
基本搭建流程参考了网上的博文以及Vimgo的Github主页 博文https://www.cnblogs.com/breg/p/5386365.html Vim-go主页(我能不能加入项目,做点贡献呢 ...
- golang 防SQL注入 基于反射、TAG标记实现的不定参数检查器
收到一个任务,所有http的handler要对入参检查,防止SQL注入.刚开始笨笨的,打算为所有的结构体写一个方法,后来统计了下,要写几十上百,随着业务增加,以后还会重复这个无脑力的机械劳作.想想就l ...
- 20155216 2016-2017-2 《Java程序设计》第七周学习总结
20155216 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 认识Lambda表达式语法 Lambda表达式不需要也不允许使用throws关键字来声明可能 ...
- 20155313 2016-2017-2 《Java程序设计》第九周学习总结
20155313 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 JDBC(Java DataBase Connectivity)即java数据库连 ...
- 【洛谷P2252】取石子游戏
题面 题解 威佐夫博弈 代码 #include<cstdio> #include<algorithm> #include<cmath> #define RG reg ...