2015-12-17 2 views
3

Я пытаюсь использовать tryCatch, запрашивая мою базу данных PostgreSQL от R. В основном запрос работает, но я не могу уловить ошибки и отреагировать на них. Вот примерКак использовать dbGetQuery в tryCatch с PostgreSQL?

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 (я не знаю, почему он не) есть обходной путь - вызов postgresqlExecStatement и postgresqlFetch вместо 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 Я некоторое время боролся с этой проблемой. Это связано с тем, как был написан код RPostgreSQL, не относящийся к R-коду (я думаю, C/C++, прошло некоторое время с тех пор, как я посмотрел на него). Он испускает ошибку для консоли, не поднимая ошибку в R. – russellpierce

Смежные вопросы