如何从 R.Data 向 SQLite 数据库插入值?

How to insert values to the SQLite database from R.Data?

我正在尝试从 R data.framesqlite 数据库插入数据,但我失败了。

这是我在R studio中使用的代码。

所以我尝试使用两个循环来加载指定文件夹(工作目录)中列出的所有 dbf 文件。然后我试图通过 sqldf 或 [=19= 将数据从 R data.frame (df[[1]]) 插入到 sqlite 数据库(我已经创建了它) ] 职能。

dbExecute 的情况下,函数无法从 R data.frame 中读取 table(在本例中为 df[[1]])。

sqldf 的情况下,该函数看不到先前在数据库中创建的 all_banks table。

关于如何处理这个问题有什么想法吗? 感谢大家。

library(sqldf)
library(DBI)
library(foreign)
library("RSQLite")



setwd("F:~/Data")
con <- dbConnect(RSQLite::SQLite(), dbname = "banks.db")
for(path in c("F:~/123-20190901",
          "F:~/123-20190801")){
  setwd(path)
  ldf <- list()
  listdbf <- dir(pattern = "*.DBF")
  for (k in 1:length(listdbf)){
     ldf[[k]] <- read.dbf(listdbf[k])
     }

  df1 <- ldf[[1]]
  df2 <- ldf[[2]]
  dbExecute(con, "insert into all_banks select DT, REGN, name_b from df1")
  sqldf("insert into all_banks select DT, REGN, name_b from df1")
}
dbDisconnect(con)

Error: no such table: df1
Error: no such table: all_banks

从根本上说,sqldfdbExecute 是两个不同的过程,前者在本地环境中工作,后者在外部数据库中工作(尽管有明显的例外)。

根据 docs

sqldf is an R package for running SQL statements on R data frames, optimized for convenience.

因此,sqldflocal 环境中在 R 数据帧上运行。默认情况下,sqldf 不用于对持久性 外部 数据库进行更改。从技术上讲,它运行一个内存中的 SQLite 数据库,该数据库在 R 会话之后不保存。因此,如果 all_banks 不是全局环境中的数据框,则不会被 sqldf 识别。话虽如此,有一个 advanced waysqldf 与永久 SQLite 数据库一起使用。但下面的解决方案可以说更容易。


根据 docsDBI::dbExecute

Executes a statement and returns the number of rows affected.

第一个参数:

conn: A DBIConnection object, as returned by dbConnect().

因此,dbExecute 外部 数据库上运行命令,并且在其范围内不使用 local 环境对象。因此,如果 df1 不是数据库中的 table,它就不会被 dbExecute.

识别

解决方案

要解决您的数据库追加需求,只需使用 DBI 的 dbWriteTable 将本地 R 数据帧推送到外部数据库 table(假设两端点的结构相同,除非使用 overwrite=TRUE).即使在关闭数据库连接或 R 会话后,对 table 的此类更改仍将永久保留。

dbWriteTable(con, name="all_banks", value=df1, append=TRUE)