Вы отметили logging , поэтому я предполагаю, что вы заинтересованы в файле журнала PostgreSQL.
Если вы не установите log_min_error_statement
в fatal
или выше, оператор всегда будет быть включены в сообщение об ошибке:
2020-04-02 14:40:28.253 CEST [3414] ERROR: null value in column "a1" violates not-null constraint
2020-04-02 14:40:28.253 CEST [3414] DETAIL: Failing row contains (12, null).
2020-04-02 14:40:28.253 CEST [3414] STATEMENT: INSERT INTO a VALUES (12, NULL);
Подсказка: , если вы используете log_destination = csvlog
, файл журнала будет проще для анализа.
Если вы заинтересованы в сообщение, отправляемое клиенту, зависит от клиента или API, который вы используете для доступа к PostgreSQL. Сервер отправляет информацию вместе с сообщением об ошибке.
Вот как это работает с psql
клиентом:
test=> \set VERBOSITY verbose
test=> INSERT INTO a VALUES (12, NULL);
ERROR: 23502: null value in column "a1" violates not-null constraint
DETAIL: Failing row contains (12, null).
SCHEMA NAME: laurenz
TABLE NAME: a
COLUMN NAME: a1
LOCATION: ExecConstraints, execMain.c:1960
Поскольку вас интересует Python, вот Пример программы, выполняющей ту же инструкцию:
#!/usr/bin/python3
from psycopg2 import connect, Error
from psycopg2.extensions import quote_ident
conn = connect("dbname=test user=laurenz")
cur = conn.cursor()
try:
cur.execute("INSERT INTO a VALUES (12, NULL)")
except Error as e:
print("Error: {}".format(e.diag.message_primary))
print("Detail: {}".format(e.diag.message_detail))
print("SQLSTATE: {}".format(e.diag.sqlstate))
print("Table: {}.{}".format(
quote_ident(e.diag.schema_name, cur),
quote_ident(e.diag.table_name, cur)
))
conn.commit()
cur.close()
conn.close()
Результат:
Error: null value in column "a1" violates not-null constraint
Detail: Failing row contains (12, null).
SQLSTATE: 23502
Table: "laurenz"."a"