MySQL和R,一次插入1000多行

时间:2016-01-21 19:38:06

标签: mysql r bulk

我正在使用R将data.frame插入MySQL数据库。我在下面的代码中一次成功插入1000行。但是,如果我有一个包含数万行的data.frame,那就不实用了。你会如何使用R进行批量插入?它甚至可能吗?

## R and MySQL
library(RMySQL)

### create sql connection object 
mydb = dbConnect(MySQL(), dbname="db", user='xxx', password='yyy', host='localhost', unix.sock="/Applications/MAMP/mysql/mysql.sock")

# get data ready for mysql 
df = data.format

# chunks 
df1 <- df[1:1000,]
df2 <- df[1001:2000,]
df3 <- df[2001:nrow(df),]

## SQL insert for data.frame, limit 1000 rows 
dbWriteTable(mydb, "table_name", df1, append=TRUE, row.names=FALSE)
dbWriteTable(mydb, "table_name", df2, append=TRUE, row.names=FALSE)
dbWriteTable(mydb, "table_name", df3, append=TRUE, row.names=FALSE)

2 个答案:

答案 0 :(得分:0)

为了完整性,如链接所示,将df写入临时表并按如下方式插入目标表:

dbWriteTable(mydb, name = 'temp_table', value = df, row.names = F, append = F)
dbGetQuery(mydb, "insert into table select * from temp_table")

答案 1 :(得分:0)

基于DBI的ODBC包现在支持快速批量插入,请参阅 这个例子由Jim Hester(https://github.com/r-dbi/odbc/issues/34)发布:

library(DBI);
con <- dbConnect(odbc::odbc(), "MySQL")
dbWriteTable(con, "iris", head(iris), append = TRUE, row.names=FALSE)
dbDisconnect(con)

由于RMySQL也是基于DBI的,因此只需“切换”数据库连接即可 使用odbc包(感谢R的标准化DBI接口)。

RMySQL

以来
  

...正在逐步取消新的RMariaDB包。

根据他们的网站(https://github.com/r-dbi/RMySQL),您可以尝试将驱动程序包切换到RMariaDB(可能他们已经实现了批量插入功能)。

有关详细信息,请参阅:https://github.com/r-dbi/RMariaDB