问题:
有没有办法使用r将多行(20k以下)插入到SQLite3表中?
更多工作:
我看过类似的答案,但他们似乎并没有这样说:
有一个“c命令”但不是“R”。
SQLite3帮助本身似乎没有提供前进的方法:
Python具有“execute many”,这使得大型插入操作很快。 RSQLite或DBI中是否有“R”类似物?我应该使用不同的库吗?
提前致谢。
答案 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
条件中提供很多粒度,而这通常是必需的(例如,设置主键和外键)。
时间序列存储在带有两列“时间”和“值”的小标题中的示例
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)
})
tb_times <- as.character(tb[['times']])
tb_values <- as.numeric(tb[['values']])
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中的保留字