2017-03-31 65 views
1

我無法獲得R語言DBI :: sqlAppendTable函數與數字以外的任何其他工作。以下是一些說明問題的代碼。我懷疑問題是sqlAppendTable不引用數據。任何修復或解決方法將不勝感激。R:sqlAppendTable只適用於數字?

num = data.frame(matrix(1:26, ncol=2)) 
let = data.frame(matrix(letters, ncol=2)) 

test.sqlAppendTable = function(dfr) { 
    #dfr: A data frame. 
    conx <- dbConnect(RSQLite::SQLite(), ":memory:") 
    on.exit(dbDisconnect(conx)) 
    dbWriteTable(conx, "temp", dfr[1:5, ]) 
    temp = dbReadTable(conx, 'temp') 
    print(temp) 
    sat = sqlAppendTable(conx, 'temp', dfr[6:10, ]) 
    print(sat) 
    rs = dbExecute(conx, sat) 
    cat('Result set (rs): ') 
    print(rs) 
    temp = dbReadTable(conx, 'temp') 
    print(temp) 
} 

test.sqlAppendTable(num) #Runs fine. 
test.sqlAppendTable(let) #Generates error: 
#Error in rsqlite_send_query([email protected], statement) : no such column: j 
+1

爲什麼不使用RSQLite的'dbWriteTable',指定* append *參數? – Parfait

+0

帶追加的dbWriteTable聽起來很有希望。 – Argent

+0

但是,在dbWriteTable的文檔中,我沒有提到append:http://127.0.0.1:31912/library/DBI/html/dbReadTable.html – Argent

回答

0

這看起來像RSQLite包中的缺陷;值應該被引用。請注意,引號在下面的例子中補充說:

DBI::sqlAppendTable(DBI::ANSI(), table = "test", data.frame(a = 1, b = "2")) 
#> <SQL> INSERT INTO "test" 
#> ("a", "b") 
#> VALUES 
#> (1, '2') 

也相應GitHub issue見。

+0

感謝您在GitHub上提出這個問題。 – Argent

0

我已經能夠湊齊一個解決辦法:

1)收件要追加在SQLite數據庫文件的臨時表(TEMP)的數據幀。

2)它追加到使用SQLite的語句中的目標表(目標):

insert into target select * from temp; 

3)滴溫度。

這運行得非常快,大概要感謝SQLite的優化​​。

附錄:

你的確可以追加使用dbWriteTable數據幀到數據庫表,還可以選擇附加= TRUE。我已經對上述的解決方法進行了測試,令人驚訝的是,解決方法的運行速度比dbWriteTable快近40%。