如何从R数据帧添加SQLite临时表?

时间:2014-03-27 16:33:27

标签: r sqldf rsqlite

我有一个与数据库文件的SQLite数据库连接。我想从其中一个表中提取一些数据,在R中进行一些处理,然后在处理过的数据的同一连接上创建一个临时表。它需要是一个临时表,因为用户可能没有对数据库的写入权限,但我希望能够在数据库中已存在的数据旁边查询这些新数据。

所以,例如:

require(sqldf)

db <- dbConnect(SQLite(), "tempdb")
dbWriteTable(db, "iris", iris)

# do some processing in R:
d <- dbGetQuery(db, "SELECT Petal_Length, Petal_Width FROM iris;")
names(d) <- c("length_2", "width_2")
d <- exp(d)

然后我想在db

的连接d中创建一个临时表

我知道我能做到:

dbWriteTable(conn=db, name= "iris_proc", value = d)

但我需要在临时表格中,dbWriteTable似乎没有这个选项。

我想到的一个解决方法是添加临时表,然后添加列并更新它们:

dbGetQuery(db, "CREATE TEMP TABLE iris_proc AS SELECT Species FROM iris;")
dbGetQuery(db, "ALTER TABLE iris_proc ADD COLUMN length_2;")

但是我无法将d中的数据输入到列中:

dbGetQuery(db, paste("UPDATE iris2 SET length_2 =", paste(d$length_2, collapse = ", "),  ";"))
Error in sqliteExecStatement(con, statement, bind.data) :
    RS-DBI driver: (error in statement: near "4.05519996684467": syntax error)

我想,即使我让它发挥作用,也会非常低效。

我认为可能有一些方法可以使用read.csv.sql执行此操作,但这似乎不适用于打开的连接对象。

1 个答案:

答案 0 :(得分:2)

使用内存数据库作为临时表:

library(RSQLite)

db <- dbConnect(SQLite(), "tempdb")
dbWriteTable(db, "iris", iris)
d <- dbGetQuery(db, "SELECT Petal_Length, Petal_Width FROM iris")
d <- exp(d)

dbGetQuery(db, "attach ':memory:' as mem")
dbWriteTable(db, "mem.d", d, row.names = FALSE) # d now in mem database

dbGetQuery(db, "select * from iris limit 3")
dbGetQuery(db, "select * from mem.d limit 3")

dbGetQuery(db, "select * from sqlite_master")
dbGetQuery(db, "select * from mem.sqlite_master")