Модуль plpy модуль также предоставляет функции
plpy.debug( |
plpy.log( |
plpy.info( |
plpy.notice( |
plpy.warning( |
plpy.error( |
plpy.fatal( |
plpy.error и plpy.fatal
фактически вызывают исключение Python, которое, если оно не перехвачено, передается в вызывающий запрос, что приводит к отмене текущей транзакции или подтранзакции. raise plpy.Error( и
msg)raise plpy.Fatal( эквивалентны
вызову msg)plpy.error( и
msg)plpy.fatal(соответственно, однако
форма msg)raise не позволяет передавать именованные аргументы.
Остальные функции лишь генерируют сообщения различных уровней важности.
Будут ли сообщения определенного уровня выводиться клиенту,
записываться в журнал сервера или и то, и другое, определяется
log_min_messages и
client_min_messages конфигурационными
переменными. См. Глава 3.4 для получения дополнительной информации.
Модуль msg аргумент передается как позиционный аргумент. Для обратной совместимости может быть указано более одного позиционного аргумента. В этом случае строковое представление кортежа позиционных аргументов становится сообщением, передаваемым клиенту.
Принимаются следующие именованные аргументы (keyword-only):
detail |
hint |
sqlstate |
schema_name |
table_name |
column_name |
datatype_name |
constraint_name |
Строковое представление объектов, переданных в качестве именованных аргументов, используется для дополнения сообщений, передаваемых клиенту. Например:
CREATE FUNCTION raise_custom_exception() RETURNS void AS $$
plpy.error("custom exception message",
detail="some info about exception",
hint="hint for users")
$$ LANGUAGE plpython3u;
=# SELECT raise_custom_exception();
ERROR: plpy.Error: custom exception message
DETAIL: some info about exception
HINT: hint for users
CONTEXT: Traceback (most recent call last):
PL/Python function "raise_custom_exception", line 4, in
hint="hint for users")
PL/Python function "raise_custom_exception"
Еще одним набором вспомогательных функций являются
plpy.quote_literal(,
строка)plpy.quote_nullable(, и
строка)plpy.quote_ident(. Они
эквивалентны встроенным функциям экранирования, описанным в Раздел 2.6.4. Они полезны при формировании произвольных запросов. Аналогом динамического SQL из раздела ... на языке PL/Python Пример 5.6.1 будет:
строка)
plpy.execute("UPDATE tbl SET %s = %s WHERE key = %s" % (
plpy.quote_ident(colname),
plpy.quote_nullable(newvalue),
plpy.quote_literal(keyvalue)))