在使用PL/Python编写的布尔存储过程的PostgreSQL检查约束中,是否可以更新错误消息的详细信息?

在使用PL/Python编写的布尔存储过程的PostgreSQL检查约束中,是否可以更新错误消息的详细信息?,python,postgresql,stored-procedures,error-handling,plpython,Python,Postgresql,Stored Procedures,Error Handling,Plpython,这个问题在(尽管很长)标题中。我有这样的代码: -- create the tables for models CREATE TABLE invoice( id SERIAL PRIMARY KEY, value VARCHAR(8) CONSTRAINT valid_money CHECK(validate_invoice_money(value)) ); 通过此程序: CREATE OR REPLACE FUNCTION validate_invoice_mon

这个问题在(尽管很长)标题中。我有这样的代码:

-- create the tables for models
CREATE TABLE invoice(
    id SERIAL PRIMARY KEY,
    value VARCHAR(8)
      CONSTRAINT valid_money CHECK(validate_invoice_money(value))
);
通过此程序:

CREATE OR REPLACE FUNCTION validate_invoice_money(test VARCHAR) RETURNS BOOLEAN AS $$
    import plpy
    import re

    if (re.match("^[0-9]+\\.[0-9]{2}$", test) == None):
        return False

    return True
$$ LANGUAGE plpython3u IMMUTABLE;
(这个例子的细节并不重要,我知道有更好的方法来验证一个值,比如使用
MONEY
类型。)

当尝试插入未通过此检查时,我会收到以下错误:

ERROR  : new row for relation "invoice" violates check constraint "valid_model"
DETAIL : Failing row contains (1, "notvalid").
(错误/详细信息描述符是我自己的代码,但是PostgreSQL错误有一个错误并提供了详细信息字段。)


我有没有办法从Python过程中更改此错误的“详细信息”部分?

您不需要其他语言;可以将普通regexp用于值约束:



结果:




回答这个问题:我认为您无法获得有关约束冲突的其他信息。

在Postgres 9.6+中,您可以使用plpython函数的详细消息引发错误,例如:

CREATE或REPLACE函数validate\u invoice\u money(test VARCHAR)
将布尔值返回为$$
进口稀土
如果(重新匹配(“^[0-9]+\\.[0-9]{2}$”,test)=None):
plpy.error(“自定义异常消息”,
detail=“关于异常的一些信息”,
hint=“用户提示”)
返回错误
返回真值
$$LANGUAGE plpython3u不可变;
插入发票
值(默认值为“notvalid”);
错误:plpy。错误:自定义异常消息
细节:关于异常的一些信息
提示:用户提示
上下文:回溯(最近一次呼叫最后一次):
PL/Python函数“验证发票金额”,第8行,在
hint=“用户提示”)
PL/Python函数“验证发票金额”

这并不能完全回答问题,但它确实很有用,谢谢!这回答了问题,干得好!
-- create the tables for models
CREATE TABLE invoice(
    id SERIAL PRIMARY KEY,
    val VARCHAR(8)
      -- CONSTRAINT valid_money CHECK(validate_invoice_money(value))
      CONSTRAINT valid_money CHECK(val ~ '^[0-9]+\.[0-9]{2}$' )
);

INSERT INTO invoice (val) VALUES ('0123.98' ); -- success
INSERT INTO invoice (val) VALUES ('a123.98' ); -- failure

SELECT * FROM invoice;
CREATE TABLE
INSERT 0 1
ERROR:  new row for relation "invoice" violates check constraint "valid_money"
DETAIL:  Failing row contains (2, a123.98).
 id |   val   
----+---------
  1 | 0123.98
(1 row)
CREATE OR REPLACE FUNCTION validate_invoice_money(test VARCHAR) 
RETURNS BOOLEAN AS $$
    import re

    if (re.match("^[0-9]+\\.[0-9]{2}$", test) == None):
        plpy.error("custom exception message",
            detail="some info about exception",
            hint="hint for users")
        return False

    return True
$$ LANGUAGE plpython3u IMMUTABLE;

insert into invoice
values (default, 'notvalid');

ERROR:  plpy.Error: custom exception message
DETAIL:  some info about exception
HINT:  hint for users
CONTEXT:  Traceback (most recent call last):
  PL/Python function "validate_invoice_money", line 8, in <module>
    hint="hint for users")
PL/Python function "validate_invoice_money"