当域检查在 postgresql 上失败时是否可以获得更好的错误消息?
Is posible to get better error message when a domain check fail on postgresql?
我创建了一个域来捕获空字符串:
CREATE DOMAIN TEXTN AS TEXT
CONSTRAINT non_empty CHECK (length(VALUE) > 0);
然后我将数据库中的所有 text/varchars 字段替换为 TEXTN。
但是,当我遇到错误时,它没有提供太多信息:
DbError { severity: "ERROR", parsed_severity: Some(Error),
code: SqlState("23514"),
message: "value for domain textn violates check constraint \"non_empty\"",
detail: None, hint: None, position: None, where_: None,
schema: Some("libs"),
table: None,
column: None, datatype: Some("textn"),
constraint: Some("non_empty")}
它甚至没有告诉我检查失败的原因 table 和字段。
如果甚至可以打印要插入的行,但至少 table 和字段是可能的?
PostgreSQL(我检查了版本 11)根本不提供此信息作为协议的一部分。考虑这些陈述:
=> CREATE DOMAIN TEXTN AS TEXT CONSTRAINT non_empty CHECK (length(VALUE) > 0);
CREATE DOMAIN
=> CREATE TABLE test_table (test_column textn);
CREATE TABLE
=> INSERT INTO test_table VALUES ('');
ERROR: value for domain textn violates check constraint "non_empty"
线路上的错误消息如下所示:
S ERROR
V ERROR
C 23514
M value for domain textn violates check constraint "non_empty\
s public
d textn
n non_empty
F execExprInterp.c
L 3494
R ExecEvalConstraintCheck
没有 test_table
或 test_column
的踪迹。
如果您对框架创建 table 的方式有一些控制,则可以使用命名 table 约束而不是域类型,如下所示:
CREATE TABLE test_table (
test_column text
CONSTRAINT test_column_check CHECK (length(test_column) > 0));
如果您确保约束名称唯一标识列,则可以使用它来恢复有问题的列。
即使对于在列上定义的 CHECK
约束,如 CREATE TABLE test_table (test_column text CHECK (length(test_column) > 0));
,PostgreSQL 也不会报告列名。您只能获得约束的名称,它由 PostgreSQL 在 table 创建时自动生成,通常以列名开头,但不能保证这一点。
我创建了一个域来捕获空字符串:
CREATE DOMAIN TEXTN AS TEXT
CONSTRAINT non_empty CHECK (length(VALUE) > 0);
然后我将数据库中的所有 text/varchars 字段替换为 TEXTN。
但是,当我遇到错误时,它没有提供太多信息:
DbError { severity: "ERROR", parsed_severity: Some(Error),
code: SqlState("23514"),
message: "value for domain textn violates check constraint \"non_empty\"",
detail: None, hint: None, position: None, where_: None,
schema: Some("libs"),
table: None,
column: None, datatype: Some("textn"),
constraint: Some("non_empty")}
它甚至没有告诉我检查失败的原因 table 和字段。
如果甚至可以打印要插入的行,但至少 table 和字段是可能的?
PostgreSQL(我检查了版本 11)根本不提供此信息作为协议的一部分。考虑这些陈述:
=> CREATE DOMAIN TEXTN AS TEXT CONSTRAINT non_empty CHECK (length(VALUE) > 0);
CREATE DOMAIN
=> CREATE TABLE test_table (test_column textn);
CREATE TABLE
=> INSERT INTO test_table VALUES ('');
ERROR: value for domain textn violates check constraint "non_empty"
线路上的错误消息如下所示:
S ERROR
V ERROR
C 23514
M value for domain textn violates check constraint "non_empty\
s public
d textn
n non_empty
F execExprInterp.c
L 3494
R ExecEvalConstraintCheck
没有 test_table
或 test_column
的踪迹。
如果您对框架创建 table 的方式有一些控制,则可以使用命名 table 约束而不是域类型,如下所示:
CREATE TABLE test_table (
test_column text
CONSTRAINT test_column_check CHECK (length(test_column) > 0));
如果您确保约束名称唯一标识列,则可以使用它来恢复有问题的列。
即使对于在列上定义的 CHECK
约束,如 CREATE TABLE test_table (test_column text CHECK (length(test_column) > 0));
,PostgreSQL 也不会报告列名。您只能获得约束的名称,它由 PostgreSQL 在 table 创建时自动生成,通常以列名开头,但不能保证这一点。