Не удается вставить фрейм данных в таблицу SQLite, если имена столбцов разные dbWriteTable

Я использую базу данных SQLite в R. Чтобы вставить фрейм данных в таблицу SQLite с помощью dbWriteTable из DBI, мне кажется, что мне нужно иметь те же имена столбцов во фрейме данных, что и в таблице . Я использовал sqldf, и это не было условием, он просто вставлял в зависимости от порядка столбцов. Есть ли способ изменить поведение dbWriteTable для принятия моего фрейма данных. Вот пример кода с dbWriteTable и sqldf

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)

person Abdelouahed BEN MHAMED    schedule 22.11.2020    source источник


Ответы (2)


Вперед, это действительно плохая идея: если столбцы расположены в неправильном порядке или если имеется неправильное количество столбцов, это приведет к непредсказуемым (или просто плохим) результатам.

Сказав это, переименуйте имена столбцов фрейма перед загрузкой.

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, чтобы игнорировать имена столбцов и просто предполагать, что все выровнены.

person r2evans    schedule 25.11.2020

Имена столбцов должны совпадать. Игнорируйте предупреждение или используйте sqldf2 определенный здесь, чтобы заглушить его.

sqldf("insert into sales select Nombre as Items, Ventes as Sales from df2",
   dbname = path)
person G. Grothendieck    schedule 22.11.2020
comment
Спасибо за Ваш ответ. Я спрашивал, можем ли мы сделать это с помощью dbWriteTable. - person Abdelouahed BEN MHAMED; 22.11.2020