使用 plpy.error 或自定义 SPIError 传递自定义错误代码 (ERRCODE)

Pass custom error code (ERRCODE) with a plpy.error or a custom SPIError

是否可以通过 plpy.error/fatal 传递自定义错误代码或继承 SPIError 传递自定义错误代码、提示等?

我找到了解决方法。使用 SPIError class 的实例,并设置 spidata 属性.

postgres=# do $$
x = plpy.SPIError('Nazdarek'); 
x.spidata = (0, "Some detail", "some hint", None, -1); 
raise x;
$$ language plpythonu;

ERROR:  plpy.SPIError: Nazdarek
DETAIL:  Some detail
HINT:  some hint
CONTEXT:  Traceback (most recent call last):
  PL/Python anonymous code block, line 4, in <module>
    raise x;
PL/Python anonymous code block

Errcode 应该输入整数值,这很不友好。我看看怎么翻译比较好

在浏览 plpython 源代码时,我目前发现的一种方法是继承 SPIError 并设置 sqlstate

raise type('MyError', (plpy.SPIError,), {'sqlstate': 'D000M'})(...)

将传播 ERRCODE D000M 并为我工作。

最好也定义一个自定义 HINT,但看起来更棘手,因为它带有 spidata