43.9. Утилитарные функции#

43.9. Утилитарные функции

43.9. Утилитарные функции

Модуль plpy также предоставляет функции

plpy.debug(msg, **kwargs)
plpy.log(msg, **kwargs)
plpy.info(msg, **kwargs)
plpy.notice(msg, **kwargs)
plpy.warning(msg, **kwargs)
plpy.error(msg, **kwargs)
plpy.fatal(msg, **kwargs)

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. Дополнительную информацию см. в разделе Глава 18.

Аргумент msg задается как позиционный аргумент. Для обратной совместимости можно задать несколько позиционных аргументов. В этом случае строковое представление кортежа позиционных аргументов становится сообщением, отправляемым клиенту.

Принимаются следующие аргументы только по ключевым словам:

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 <module>
    hint="hint for users")
PL/Python function "raise_custom_exception"

Еще один набор утилитных функций - это plpy.quote_literal(string), plpy.quote_nullable(string) и plpy.quote_ident(string). Они эквивалентны встроенным функциям заключения в кавычки, описанным в разделе Раздел 9.4. Они полезны при построении ad-hoc запросов. Эквивалент PL/Python динамического SQL из примера Пример 40.1 будет:

plpy.execute("UPDATE tbl SET %s = %s WHERE key = %s" % (
    plpy.quote_ident(colname),
    plpy.quote_nullable(newvalue),
    plpy.quote_literal(keyvalue)))