2014-03-27 14 views
1

我有一個SQLite數據庫連接到數據庫文件。我想從其中一個表中提取一些數據,在R中執行一些處理,然後在處理後的數據的同一連接上創建一個臨時表。它需要是臨時表,因爲用戶可能沒有對數據庫的寫訪問權限,但我希望能夠在數據庫中已有的數據旁邊查詢這些新數據。如何從R數據框添加SQLite臨時表?

如此,例如:

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) 

,然後我想從d

做一個臨時表中的連接db我知道我可以做的:

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

,但我需要在臨時表中,並且在dbWriteTable中似乎沒有此選項。我想到的

一個解決辦法是增加一個臨時表,然後添加列和更新它們:從d

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

但我不能得到的數據爲列:

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做到這一點,但這似乎不適用於打開的連接對象。

+0

使用的是開發版本,增加了一個'temporary'參數 – hadley

回答

1

使用的內存數據庫的臨時表:

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") 
+0

完美,謝謝!有了這個,我甚至不需要創建一個新的內存數據庫,但是我可以使用已經存在的臨時數據庫:dbWriteTable(db,「temp.d」,d,row.names = FALSE) – dspringate