用R语言做数据分析时,常常需要从多种数据源取数据,其中数据库是非常常见的数据源。RMySQL包,可以在R语言中对Mysql数据库进行增删改查的操作。

安装:

install.packages(‘RMySQL’,type=‘source’)

报错:

fatal error: mysql.h: No such file or directory

linux CentOS解决方式

报错上面提示:没有发现依赖包需要安装
环境下安装:
rpm: mariadb-devel | mysql-devel
sudo yum install mariadb-devel
sudo yum install mysql-devel

然后运行install.packages(‘RMySQL’)安装成功

docker安装:

apt update //只检查,不更新(已安装的软件包是否有可用的更新,给出汇总报告)
apt upgrade //更新已安装的软件包
apt install mysql-server

//vim: command not found
apt-get install vim
apt-get install mariadb-devel
apt-get install libmysqlclient-dev

使用

install.packages("RMySQL")
library(RMySQL)
help(package="RMySQL") #查看说明文档
#创建数据库连接
con <- dbConnect(MySQL(), host="", dbname="", user="", password="")

summary(con) #获取连接信息
dbGetInfo(con) #获取连接信息
dbListTables(con) #查看database下所有表格
dbRemoveTable(con, “test”) #删除名为test的表

用dbConnect函数创建连接,驱动类型设置为MySQL(),用户名user、密码password、主机host、端口port、数据库dbname这些参数需要根据实际情况修改,其中端口port默认值是3306。

RMySQL基本操作

创造一个新的数据库并使用,SQL查询可以通过dbSendQuery或dbGetQuery传给数据库管理系统。dbGetQuery传送查询语句,把结果以数据框形式返回。dbSendQuery传送查询,返回的结果是继承"DBIResult"的一个子类的对象。函数fetch用于获得查询结果的部分或全部行,并以列表返回。函数dbHasCompleted确定是否所有行已经获得了,而dbGetRowCount返回结果中行的数目。如果只是简单的读整个表,也可以用dbReadTable函数。

3种方法在数据库中创造表:

dbCreateTable函数创建表:

# 方法1:字符向量
dbCreateTable(con,'table1',fields =c("id"='int',"value"="float"))
# 方法2:数据框
dbCreateTable(con,'table2',fields = mtcars)

注意点:
设置fields参数时,用命名的字符向量(名字为字段名,值为字段数据类型)或数据框表示
表只能创建一次,重复创建会报错。

3.sql语句创建表
运行dbSendQuery函数,调用sql语句创建表,该函数返回一个RMySQLResult类。该方法可以重复运行,不会报错。

# creating tables in bookstore:
dbSendQuery(mydb, "
CREATE TABLE books (
book_id INT,
title VARCHAR(50),
author VARCHAR(50));")

显示数据库中的表:

# Show table using R:
dbListTables(mydb)

写数据库表:

dbWriteTable函数写入表

#写数据库表  
fruits <-data.frame(id=1:5,name=c("苹果","香蕉","梨子","玉米","西瓜"),price=c(8.8,4.98,7.8,6,2.1),status=c("无","打折","无","售罄","批发"))
dbListTables(con)
dbWriteTable(con,"表名",fruits)
dbListTables(con)

注意点:
第一次写入时,若数据库中无该表,会根据表名自动创建
重复写入时,需要设置写入行为:

R语言链接mysql数据库的依赖包RMySQL安装及使用。_数据库


append和overwrite两个参数不能同时设置为TRUE。

sql语句插入数据:
运行dbSendStatment函数,调用sql语句插入数据。

dbSendStatement(con,'insert into table1 values(1,12)')

注意点:
重复运行会重复插入数据

读数据库:

dbReadTable函数读取表:

#读数据库  
dbReadTable(con,"表名")#中文出现乱码,这是因为字符编码格式不统一的问题

注意点:
返回的是整个表的数据
为解决中文显示问题,若运行R的操作系统为window,需要设置编码为gbk,为Linux则需要设置为utf8
返回的数据格式为data.frame

sql语句读取表:
通过运行dbGetQuery或dbSendQuery函数,调用sql语句读取表。
dbGetQuery函数运行sql语句,返回data.frame。可以在sql语句中编写筛选语句。

# 读取完整表
dbGetQuery(con,'select * from city')
# 读取筛选的表
dbGetQuery(con,'select id,name from city where id > 10')

dbSendQuery函数运行sql语句,返回MySQLResult类。对该类使用dbFetch函数,可以筛选行,返回data.frame。用完后需要用dbClearResult函数清理结果。

# 筛选前3行数据
res <- dbSendQuery(con,'select * from city')
dbFetch(res,3)

删除表

用dbRemoveTable函数删除表。

# 删除表
dbRemoveTable(con,'table1')

完成所有的操作后,需要关闭连接。

# 关闭连接
dbDisconnect(con)