当列名不同 dbWriteTable 时无法将数据框插入 SQLite table

Can't Insert dataframe to SQLite table when column names different dbWriteTable

我在 R 中使用 SQLite 数据库。要使用 DBI 中的 dbWriteTable 将数据框插入 SQLite table,似乎我需要数据框中的列名与 table 中的列名相同。 我正在使用 sqldf 这不是条件,它只是根据列的顺序插入。 有没有办法改变 dbWriteTable 的行为以接受我的数据框。 这是包含 dbWriteTablesqldf

的示例代码
library(RSQLite)
library(sqldf)

path = "data_base.sqlite"

conn = DBI::dbConnect(RSQLite::SQLite(),path)
dbExecute(conn, "CREATE TABLE sales(Items INT, Sales REAL)")

df1 = data.frame(Items = c(12,14,5), Sales = c(111.6,130.2,46.5))
dbWriteTable(conn,name = "sales",value = df1, append=TRUE, row.names=FALSE)

df2 = data.frame(Nombre = c(2,6,9), Ventes = c(18.6,55.8,83.7))
dbWriteTable(conn,name = "sales",value = df2, append=TRUE, row.names=FALSE)

sqldf("insert into sales select * from `df2`",dbname = path)

列名必须对应。忽略警告或使用 sqldf2 定义的 here 来消除它。

sqldf("insert into sales select Nombre as Items, Ventes as Sales from df2",
   dbname = path)

前面,这是一个非常糟糕的主意:如果列的顺序错误或列数不正确,那么这将产生不可预测的(或只是不好)结果。

话虽如此,请在上传前重命名框架的列名称。

df2 = data.frame(Nombre = c(2,6,9), Ventes = c(18.6,55.8,83.7))
names(df2)
# [1] "Nombre" "Ventes"
names(df2) <- dbListFields(conn, "sales")
names(df2)
# [1] "Items" "Sales"
dbWriteTable(conn,name = "sales",value = df2, append = TRUE, row.names = FALSE)
DBI::dbGetQuery(conn, "select * from sales")
#   Items Sales
# 1    12 111.6
# 2    14 130.2
# 3     5  46.5
# 4     2  18.6
# 5     6  55.8
# 6     9  83.7

如果您不想更改 df2 的名称(出于某种原因),那么您可以“内联”:

dbWriteTable(
  conn, name = "sales",
  value = setNames(df2, dbListFields(conn, "sales")),
  append = TRUE, row.names = FALSE)

除此之外,那么...,您不应该更改dbWriteTable以忽略列名并假设所有内容都是对齐的。