所以我正在做一些业务逻辑,并希望运行一些类似于
的代码 select id from blah where foo = 1234 for update nolock
当blah
中的相应行被锁定时,此代码抛出DataMapper :: SQLError。这是理想的行为;我想捕获此错误并使用它来通知我的应用程序逻辑。但我想重新抛出任何其他SQL错误,因为它们与我正在编程的情况不同,并且以相同的方式捕获它们将是错误的。
返回的错误对象有一个字符串错误消息和一个数字代码(50463045
)。似乎比较数字代码会很棒,但我不想在我的代码中嵌入常量50463045
,而不需要对它如何确定它进行一些简单的理解。值得注意的是,Postgres manual suggests that the error code for this state是55P03
,这似乎并不相同。我不知道我能相信这个神奇的数字,以及除了实验之外如何确定它,所以我对使用它并不是很满意。
如何确定错误代码?
答案 0 :(得分:0)
互联网令人沮丧无益,因为搜索有关DataObjects SQL错误的内容似乎主要是返回其他软件引发错误的问题,而不是错误本身的信息...但是在找到正确的源代码并浏览之后源代码我终于找到了do_postgres.c:
void do_postgres_raise_error(VALUE self, PGresult *result, VALUE query) {
const char *message = PQresultErrorMessage(result);
char *sql_state = PQresultErrorField(result, PG_DIAG_SQLSTATE);
int postgres_errno = MAKE_SQLSTATE(sql_state[0], sql_state[1], sql_state[2], sql_state[3], sql_state[4]);
PQclear(result);
data_objects_raise_error(self, do_postgres_errors, postgres_errno, message, query, rb_str_new2(sql_state));
}
注意如何将5个字符的状态传递给MAKE_SQLSTATE
...然后也传递给data_objects_raise_error
本身。我无法追踪定义MAKE_SQLSTATE的位置,以找出制作此整数的疯狂操作,但看起来我可以直接使用错误对象的.sqlstate
属性,并使我的条件{{1} }。