Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby DataObjects::SQLError对象的.code如何对应于数据库发出的错误?_Ruby_Postgresql_Datamapper - Fatal编程技术网

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

Ruby DataObjects::SQLError对象的.code如何对应于数据库发出的错误?,ruby,postgresql,datamapper,Ruby,Postgresql,Datamapper,所以我在做一些业务逻辑,并希望运行一些类似 从blah中选择id,其中foo=1234用于更新nolock 当blah中的对应行被锁定时,此代码抛出DataMapper::SQLError。这是可取的行为;我希望捕获此错误并使用它通知我的应用程序逻辑。但是我想重新抛出任何其他SQL错误,因为它们与我正在编程的情况不同,用同样的方法捕捉它们是错误的 返回的错误对象具有字符串错误消息和数字代码50463045。似乎比较数字代码会很好,但我不想在代码中嵌入常数50463045,而不了解它是如何确定的。

所以我在做一些业务逻辑,并希望运行一些类似

从blah中选择id,其中foo=1234用于更新nolock

当blah中的对应行被锁定时,此代码抛出DataMapper::SQLError。这是可取的行为;我希望捕获此错误并使用它通知我的应用程序逻辑。但是我想重新抛出任何其他SQL错误,因为它们与我正在编程的情况不同,用同样的方法捕捉它们是错误的

返回的错误对象具有字符串错误消息和数字代码50463045。似乎比较数字代码会很好,但我不想在代码中嵌入常数50463045,而不了解它是如何确定的。值得注意的是,这是55P03,这似乎不是一回事。我不知道我能相信多少这个神奇的数字,也不知道除了实验之外如何确定它,所以我不太习惯使用它


错误代码是如何确定的?

互联网毫无帮助,因为搜索有关DataObjects SQL错误的信息似乎大多会返回引发错误的其他软件的问题,而不是错误本身的信息。。。但是在找到正确的源代码并浏览了我最终找到的源代码之后:

请注意如何传递一个5个字符的状态以使_SQLSTATE。。。然后还将错误本身传递给数据对象。我无法追踪MAKE_SQLSTATE是在哪里定义的,以找出生成此整数的疯狂操作,但似乎我可以直接使用error对象的.SQLSTATE属性,并使我的条件e.SQLSTATE=='55P03'

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));
}