gpt4 book ai didi

ruby - DataObjects::SQLError 对象的 .code 如何对应于数据库发出的错误?

转载 作者:行者123 更新时间:2023-11-29 14:01:56 24 4
gpt4 key购买 nike

所以我正在做一些业务逻辑并想运行一些代码

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 state55P03,这似乎不是一回事。我不知道我可以在多大程度上信任这个神奇的数字,也不知道除了实验之外如何确定它,所以我不太习惯使用它。

错误码是如何确定的?

最佳答案

互联网非常无用,因为搜索有关 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 属性,并使我的条件e.sqlstate == '55P03'

关于ruby - DataObjects::SQLError 对象的 .code 如何对应于数据库发出的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10303725/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com