0

qustionは(しかし長いですが)タイトルです。この手順でPL/Pythonで書かれたbooleanストアドプロシージャを使ったPostgreSQLのCHECK制約では、エラーメッセージの詳細を更新できますか?

-- 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の手順からこのエラーの部分?

答えて

1

9.6+あなたがutility functions,例えばを使用してplpythonの関数から詳細なメッセージとエラーを発生させることができます。:

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" 
+0

これは質問、素晴らしい仕事に答えます! –

1

追加の言語は必要ありません。あなたは値制約の平野正規表現を使用することができます。


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

そして、質問に答えるために:私はあなたを思いませんが制約違反に関する追加情報を得ることができます。 Postgresので

+0

をこれは正確に質問に答えていないが、それは間違いなく便利です、ありがとう! –

関連する問題