2015-12-17 99 views
3

我試圖使用tryCatch從R查詢我的PostgreSQL數據庫。 基本上查詢工作正常,但我無法設法發現錯誤並對它們做出反應。這裏有一個例子如何在PostgreSQL的tryCatch中使用dbGetQuery?

insert_rows <- function(dframe,con){ 

out <- list() 
for(i in 1:nrow(dframe)){ 
query <- .... some insert statement 
tryCatch({dbGetQuery(con,query)},error=function(e) print("caught")) 
} 

} 

當我創建一個錯誤,例如通過輸入重複的記錄到獨特的PK,我確實看到PostgreSQL的錯誤和警告,但它是從RPostgreSQL的標準打印輸出。在其他情況下,我使用tryCatch,它總是以這種方式工作。我用dbGetQuery很多,但我不能讓他們一起工作。另外,將tryCatch放入列表中的確有很大幫助。

回答

2

使用dbSendQuery發送插入語句。該tryCatch將抓住在這種情況下例外:

tryCatch({ 
    dbSendQuery(con, "insert into wrongtable values(1, 2, 3)") 
}, 
error = function(e) print(e) 
) 

對於使用dbGetQuery(我不知道失敗的原因),有一種變通方法 - 呼叫postgresqlExecStatementpostgresqlFetch代替dbGetQuery

tryCatch({ 
    res <- postgresqlExecStatement(con, "select * from thereisnotablewiththisname") 
    postgresqlFetch(res) 
}, 
error = function(e) print(e), 
warning = function(w) print(w) 
) 
+0

dbSendquery確實可行。不知道爲什麼我從來沒有考慮過它。儘管如此,理解爲什麼'dbGetQuery'在這件事上失敗會很有趣。 –

+0

@MattBannert我一直在爭論這個問題。非R代碼支持RPostgreSQL的編寫方式是固有的(我認爲C/C++,自從我看了它之後已經有一段時間了)。它向控制檯發出錯誤而不會在R中產生錯誤。 – russellpierce