R和RSQLite是否有“executemany”模拟?

时间:2015-12-04 16:45:49

标签: r sqlite

问题
有没有办法使用r将多行(20k以下)插入到SQLite3表中?

更多工作
我看过类似的答案,但他们似乎并没有这样说:

有一个“c命令”但不是“R”。

SQLite3帮助本身似乎没有提供前进的方法:

Python具有“execute many”,这使得大型插入操作很快。 RSQLite或DBI中是否有“R”类似物?我应该使用不同的库吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

dbWriteTable有一个append参数,允许添加到表中。使用内置的BOD数据框:

library(RSQLite)
con <- dbConnect(SQLite())
dbWriteTable(con, "BOD", BOD) # create the table

dbWriteTable(con, "BOD", 2*BOD, append = TRUE) # add some more rows

答案 1 :(得分:1)

有一种适当的方法可以遍历data.frame或tibble中的行,并将每一行一个接一个地插入SQLite表中。使用dbWriteTable的简单解决方案无法在表参数化和INSERT条件中提供很多粒度,而这通常是必需的(例如,设置主键和外键)。

时间序列存储在带有两列“时间”和“值”的小标题中的示例

  1. 创建表格
con <- DBI::dbConnect(RSQLite::SQLite(), db_path)

table_name <- 'my_ts'

com <- as.character(stringr::str_glue("CREATE TABLE IF NOT EXISTS '{table_name}' \
                                     ('times' TEXT NOT NULL, 'values' REAL, PRIMARY KEY(times));"))

DBI::dbWithTransaction(con, {
     DBI::dbExecute(con, com)
    })

  1. 将小标题列存储为向量
tb_times <- as.character(tb[['times']])
tb_values <- as.numeric(tb[['values']])
  1. 插入行
for (i in seq_along(index(tb))) {
    com <- as.character(stringr::str_glue("INSERT OR REPLACE INTO '{table_name}'(times, 'values') \
                                        VALUES('{tb_times[i]}', {tb_values[i]});"))
    DBI::dbWithTransaction(con, {
        DBI::dbExecute(con, com)
    })
}

RSQLite::dbDisconnect(con)

p.s。 “值”位于INSERT语句中的引号之间,因为它是SQLite中的保留字