如何从 R.Data 向 SQLite 数据库插入值?
How to insert values to the SQLite database from R.Data?
我正在尝试从 R data.frame
向 sqlite
数据库插入数据,但我失败了。
这是我在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
从根本上说,sqldf
和 dbExecute
是两个不同的过程,前者在本地环境中工作,后者在外部数据库中工作(尽管有明显的例外)。
根据 docs、
sqldf is an R package for running SQL statements on R data frames, optimized for convenience.
因此,sqldf
在 local 环境中在 R 数据帧上运行。默认情况下,sqldf
不用于对持久性 外部 数据库进行更改。从技术上讲,它运行一个内存中的 SQLite 数据库,该数据库在 R 会话之后不保存。因此,如果 all_banks 不是全局环境中的数据框,则不会被 sqldf
识别。话虽如此,有一个 advanced way 将 sqldf
与永久 SQLite 数据库一起使用。但下面的解决方案可以说更容易。
根据 docs、DBI::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)
我正在尝试从 R data.frame
向 sqlite
数据库插入数据,但我失败了。
这是我在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
从根本上说,sqldf
和 dbExecute
是两个不同的过程,前者在本地环境中工作,后者在外部数据库中工作(尽管有明显的例外)。
根据 docs、
sqldf is an R package for running SQL statements on R data frames, optimized for convenience.
因此,sqldf
在 local 环境中在 R 数据帧上运行。默认情况下,sqldf
不用于对持久性 外部 数据库进行更改。从技术上讲,它运行一个内存中的 SQLite 数据库,该数据库在 R 会话之后不保存。因此,如果 all_banks 不是全局环境中的数据框,则不会被 sqldf
识别。话虽如此,有一个 advanced way 将 sqldf
与永久 SQLite 数据库一起使用。但下面的解决方案可以说更容易。
根据 docs、DBI::dbExecute
Executes a statement and returns the number of rows affected.
第一个参数:
conn
: A DBIConnection object, as returned bydbConnect()
.
因此,dbExecute
在 外部 数据库上运行命令,并且在其范围内不使用 local 环境对象。因此,如果 df1 不是数据库中的 table,它就不会被 dbExecute
.
解决方案
要解决您的数据库追加需求,只需使用 DBI 的 dbWriteTable
将本地 R 数据帧推送到外部数据库 table(假设两端点的结构相同,除非使用 overwrite=TRUE
).即使在关闭数据库连接或 R 会话后,对 table 的此类更改仍将永久保留。
dbWriteTable(con, name="all_banks", value=df1, append=TRUE)