假设我有一些刷新数据表的SQL代码,我想安排一个R脚本来安排这段代码每天运行,有没有办法捕获SQL代码可能抛出的任何潜在错误消息,并将该错误消息保存到R变量中,而不是显示在R控制台日志中?
例如,假设我在BigQuery中有一个存储过程sp_causing_error()
,它从源表source_table
中获取数据并刷新目标表table_to_refresh
。
CREATE OR REPLACE PROCEDURE sp_causing_error()
BEGIN
CREATE OR REPLACE TABLE table_to_refresh AS (
Select non_existent_column, x, y, z
From source_table
);
END;
假设source_table
的模式已更改,列non_existent_column
不再存在。当尝试通过以下方式在RStudio中调用sp_causing_error()
时:
library(bigrquery)
query <- "CALL sp_causing_error()"
bq_project_query(my_project, query)
我们会在控制台上打印一条错误消息(它掩盖了在BigQuery中运行时会遇到的实际错误消息):
UseMethod("as_bq_table")中的错误:"as_bq_table"没有适用的方法应用于类"NULL"的对象
如果我们在BigQuery中运行sp_causing_error()
,它会抛出一条错误消息,指出:
查询错误:无法识别的名称:[sp抛出错误:3:8]处不存在列
当执行SQL时,BigQuery中显示的查询错误消息是否在bigrquery中的任何位置捕获?我的目标是在R脚本中有某种try/catch块,用于捕获错误消息,如果SQL代码没有成功运行,则可以将该错误消息写入输出文件。希望有一种方法可以从BigQuery中捕获描述性错误消息,并将其分配给R变量以供进一步处理。
- 更新**
R的tryCatch()
函数在这里非常有用,可以捕获R错误消息:
query <- "CALL sp_causing_error()"
result <- tryCatch(
bq_project_query("research-01-217611", query),
error = function(err) {
return(err)
}
)
result
现在包含来自R控制台的错误消息:
使用方法中的错误("as_bq_table"):没有适用于'as_bq_table'的方法应用于类"NULL"的对象〉
然而,这仍然不能描述我们在BigQuery中执行相同的SQL代码时看到的实际错误消息,上面引用的代码引用了一个无法识别的列名。我们是否能够捕获该错误消息,而不是更一般的R错误消息?
1条答案
按热度按时间e0bqpujr1#
更新/答复
使用BigQuery的Begin...Exception... End语法 Package R中的存储过程调用,让我们可以获得实际的错误消息。
**警告:**请注意,如果存储过程成功完成,此解决方案可能会导致R错误,因为
error_flag
将不存在,除非在存储过程的末尾显式传递。解决方法是在BigQuery中的存储过程末尾添加一行以适当地设置标志,以便bq_table_download()
函数在存储过程成功运行时获得值: