- 用SQL来提取需要的数据,存为文本再由R来读入。
- 将R与外部数据库连接,直接在R中操作数据库。
- ODBC方式,需要安装RODBC包并安装ODBC驱动(个人感觉,这种方法相对DBI方式不太方便,所以不做过多介绍)
- DBI方式,可以根据已经安装的数据库类型来安装相应的驱动
基于ODBC协议
如果你决定应用ODBC协议,那么你要确认可以应用该协议和数据库进行通信,这可能需要在数据库端安装相关的驱动程序。在R端,需要安装RODBC包。如果在Windows系统上运行R,那么无论MySQL数据库服务器在该台计算机上还是在另一台计算机上(可以是其他操作系统),从R连接数据库的最简便的方法是通过ODBC(开放性数据库互连)协议。
MySQL ODBC接口具体配置流程如下:
载入RODBC包
library(RODBC)
因为数据表gspc存放在本机计算机MySQL的mysql数据库中,所以首先建立与mysql数据库的连接myodbc,然后连接数据库mysql
channel = odbcConnect(dsn = "myodbc", uid = "root", pwd = "wangzf711235813")
在mysql数据库中提取出数据表gspc
Data = sqlFetch(channel, sqtable = "gspc", rownames = TRUE, colnames = TRUE)
展示读取的数据, 并查看数据的状态
dim(Data)
head(Data)
str(Data)
关闭数据库连接
odbcClose(channel)
ODBC包主要函数install.packages("RODBC")
library(RODBC)
channel <- odbcConnect(dsn, uid, pwd) #建立本地连接
sqlTables(channel) #查看你在上面所选数据库中的所有表
data <- sqlFetch(channel, sqtable) #将使用的数据库中的表sqtable连接到R,这样就实现了在R中操作数据库中的数据
sqlSave(channel, dat) #将R中的数据集dat存储到MySQL
query = "SELECT *
FROM table_name
WHERE condition;"
sq <- sqlQuery(channel, query) #在R中通过sql语句query来提取数据
odbcClose(channel) #关闭连接
基于DBI包提供的通用接口和每个数据库管理系统(DBMS)专有的包
DBI包 、RMySQL包等## 载入DBI包
library(DBI)
## 与服务器建立连接,这里的连接是MySQL类型的,也可以是其他类型的服务器,例如SQL Sever...,这里我们应用一个给定读取数据权限的Web数据库,用户名和主机名已经给定。
ucscDb = dbConnect(RMySQL::MySQL(), user = "genome", host = "genome-mysql.cse.ucsc.edu")
## 向连接的服务器发出查询请求,要求列出连接到服务器中的所有数据库
databases = dbGetQuery(conn = ucscDb, statement = "show databases;")
##断开与服务器的连接
dbDisconnect(ucscDb)
## 列出查询结果,这里就是列出了该服务器中的所有数据库
head(databases)
dim(databases)
## 对其中的数据库hg1g进行探索,那就建立与数据库hg19的连接
hg19 = dbConnect(RMySQL::MySQL(), dbname = "hg19", user = "genome", host = "genome-mysql.cse.ucsc.edu")
## 列出hg19中的所有数据表,并查看所有表的个数,这里只列出前6个表
allTables = dbListTables(hg19)
## table个数
length(allTables)
head(allTables)
## 列出数据库hg19中表`affyU133Plus2`的所有变量名及数据的观测值个数
dbListFields(hg19, "affyU133Plus2")
dbGetQuery(hg19, "select count(*) from affyU133Plus2")
## 读取数据表affyU133Plus2
affyData = dbReadTable(hg19, "affyU133Plus2")
head(affyData, 3)
## 记得断开与数据库的连接
dbDisconnect(hg19)
探索本人电脑上的MySQL数据库, 其中
pagedb数据库是我硕士论文中用到的6个用Boosting算法分类的数据。
library(DBI)
library(RMySQL)
channel1 = dbConnect(drv = RMySQL::MySQL(), username = "root", password = "wangzf711235813")
dbGetQuery(conn = channel1, statement = "show databases;")
dbDisconnect(channel1)
channel2 = dbConnect(drv = RMySQL::MySQL(), dbname = "pagedb", username = "root", password = "wangzf711235813")
summary(channel2)
dbGetInfo(channel2)
dbListResults(channel2)
dbGetException(channel2)
show(channel2)
db = RMySQL::MySQL()
db
dbGetInfo(db)
dbListConnections(db)
summary(db)
dbListTables(conn = channel2)
simu5_data = dbReadTable(conn = channel2, name = "simulation_5")
head(simu5_data)
dbListFields(conn = channel2, name = "simulation_5")
dbWriteTable(channel2, name = "mtcars", value = mtcars, overwrite = TRUE)
res = dbSendQuery(channel2, "SELECT * FROM mtcars ORDER BY cyl")
dbApply(res, INDEX = "cyl", function(x, grp) quantile(x$mpg, names=FALSE))
dbClearResult(res)
dbRemoveTable(channel2, name = "mtcars")
dbDisconnect(channel2)
channel = dbConnect(MySQL(), dbname, username, password) #建立本地连接
summary(channel)
dbGetInfo(channel)
dbListResults(channel)
dbGetException(channel)
show(channel)
db = RMySQL::MySQL()
db
dbGetInfo(db)
dbListConnections(db)
summary(db)
dbListTables(channel) #查看数据库的表
dbReadTable(channel, name) #获取整个name表数据
dbListFields(channle, name) #获取name表的变量名
dbWriteTable(channel, name, value) #将R中的数据导出到MySQL数据库
dbRemoveTable(channel, name) #删除MySQL数据库中的name表
res = dbSendQuery(conn, statement)
dbGetStatement(res)
dbColumnInfo(res)
dbGetRowsAffected(res)
dbGetRowCount(res)
dbHasCompleted(res)
dbGetInfo(res)
dbClearResult(res)
# transactions: DBMS事务管理
dbCommit(conn) #提交事务(数据库中的数据发生变化)
dbBegin(conn) #设置事务起始点(数据库中的数据原始状态)
dbRollback(conn) #返回事务起始点(数据库中的数据不发生变化)
dbDisconnect(channel) #关闭连接