如何从R.Data向SQLite数据库插入值?
我正试图从R如何从R.Data向SQLite数据库插入值?,sql,r,database,rsqlite,Sql,R,Database,Rsqlite,我正试图从Rdata.frame向sqlite数据库插入数据,但失败了 这是我在R studio中使用的代码 因此,我尝试使用两个循环加载指定文件夹(工作目录)中列出的所有dbf文件。然后我试图通过sqldf或dbExecute函数将Rdata.frame(df[[1]])中的数据插入sqlite数据库(我已经创建了它) 在dbExecute的情况下,函数无法从Rdata.frame读取表格(在这种情况下df[[1]]) 在sqldf的情况下,该函数不会看到数据库中先前创建的所有\u banks
data.frame
向sqlite数据库插入数据,但失败了
这是我在R studio中使用的代码
因此,我尝试使用两个循环加载指定文件夹(工作目录)中列出的所有dbf
文件。然后我试图通过sqldf
或dbExecute
函数将Rdata.frame
(df[[1]]
)中的数据插入sqlite
数据库(我已经创建了它)
在dbExecute
的情况下,函数无法从Rdata.frame
读取表格(在这种情况下df[[1]]
)
在sqldf
的情况下,该函数不会看到数据库中先前创建的所有\u banks表
有没有办法解决这个问题?
谢谢大家
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
库(sqldf)
图书馆(DBI)
图书馆(外文)
图书馆(“RSQLite”)
setwd(“F:~/Data”)
con基本上,sqldf
和dbExecute
是两个不同的过程,前者在本地环境中工作,后者在外部数据库中工作(尽管有明显的例外)
每
sqldf是一个R包,用于在R数据帧上运行SQL语句,为方便起见进行了优化
因此,sqldf
,在本地环境中的R个数据帧上运行。默认情况下,sqldf
不用于对持久的外部数据库进行更改。从技术上讲,它运行一个内存中的SQLite数据库,该数据库在R会话之后不会保存。因此,如果在全球环境中,所有的银行都不是一个数据帧,它将不会被sqldf
识别。尽管如此,仍然存在一种将sqldf
与永久性SQLite数据库一起使用的方法。但下面的解决方案可以说更容易
Per,DBI::dbExecute
执行语句并返回受影响的行数
第一个论点是:
conn
:由dbConnect()
返回的DBIConnection对象
因此,dbExecute
在外部数据库上运行命令,并且在其范围内不使用本地环境对象。因此,若df1不是数据库中的表,则它将不会被dbExecute
识别
解决方案
要解决数据库附加需求,只需使用DBI,它将本地R数据帧推送到外部数据库表中(假设两个端点上的结构相同,除非使用overwrite=TRUE
)。即使在关闭数据库连接或R会话之后,对表的此类更改仍将保持永久性
dbWriteTable(con, name="all_banks", value=df1, append=TRUE)