Pg set error verbosity: примеры (PHP)

Настройка детализации ошибок PostgreSQL в PHP с помощью pg_set_error_verbosity
Раздел: Базы данных (PostgreSQL)
pg_set_error_verbosity(PgSql\Connection $connection, int $verbosity): int
Описание функции pg_set_error_verbosity

Функция pg_set_error_verbosity() определяет уровень детализации сообщений об ошибках, которые возвращает сервер PostgreSQL. Она применяется для настройки количества информации в сообщениях об ошибках, что полезно при отладке SQL-запросов и обработке исключительных ситуаций в приложении.

Функция используется после установки соединения с базой данных. Она влияет на все последующие запросы, выполняемые через это соединение.

Аргументы функции:

  • connection (ресурс PostgreSQL, необязательный) – идентификатор подключения к базе данных. Если параметр не указан, используется последнее открытое соединение.
  • verbosity (целое число) – уровень детализации. Принимает одну из предопределенных констант:
    • PGSQL_ERRORS_TERSE – возвращаются краткие сообщения: severity, primary text и необязательно позиция ошибки.
    • PGSQL_ERRORS_DEFAULT – стандартный уровень, включает severity, primary text, detail, hint и позицию.
    • PGSQL_ERRORS_VERBOSE – максимальная детализация: добавляются информация о контексте, имени столбца, таблицы и схемы.

Функция возвращает предыдущий уровень детализации в виде целого числа или false в случае ошибки.

Примеры использования
Установка минимальной детализации

Код:

$conn = pg_connect('host=localhost dbname=test');
$oldLevel = pg_set_error_verbosity($conn, PGSQL_ERRORS_TERSE);
$result = pg_query($conn, 'SELECT * FROM несуществующая_таблица');
if (!$result) {
    echo pg_last_error($conn);
}

Результат (пример):

ERROR: relation "несуществующая_таблица" does not exist at character 15
Установка максимальной детализации

Код:

pg_set_error_verbosity($conn, PGSQL_ERRORS_VERBOSE);
$result = pg_query($conn, 'INSERT INTO users (id) VALUES (NULL)');
if (!$result) {
    echo pg_last_error($conn);
}

Результат (пример):

ERROR: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null).
SCHEMA NAME: public
TABLE NAME: users
COLUMN NAME: id
Альтернативные функции в PHP
  • pg_last_error() – возвращает строку с последним сообщением об ошибке для соединения. Предпочтительнее для быстрого получения текста ошибки без изменения уровня детализации.
  • pg_result_error() – получает сообщение об ошибке, связанное с конкретным ресурсом результата запроса. Используется, когда нужно получить ошибку для определенного запроса, а не соединения.
  • pg_set_error_context_visibility() – управляет включением контекста ошибки в сообщения. Может комбинироваться с pg_set_error_verbosity для более тонкой настройки.

Выбор функции зависит от задачи: для глобальной настройки детализации используется pg_set_error_verbosity, для получения ошибки конкретного запроса – pg_result_error.

Аналоги в других языках
Python (psycopg2)

Уровень детализации ошибок настраивается через объект соединения или курсора. Пример:

import psycopg2
conn = psycopg2.connect('dbname=test')
cur = conn.cursor()
try:
    cur.execute('SELECT * FROM несуществующая_таблица')
except psycopg2.Error as e:
    print(e.pgerror)  # Подробное сообщение
    print(e.diag.table_name)  # Доступ к деталям через диагностику
JavaScript (Node.js, pg)

Библиотека pg возвращает объект ошибки со свойствами. Пример:

const { Client } = require('pg');
const client = new Client();
client.connect();
client.query('SELECT * FROM несуществующая_таблица', (err, res) => {
    if (err) {
        console.log(err.message); // Основное сообщение
        console.log(err.detail);  // Детали
    }
});

Pg set error verbosity в MySQL

Для получения детальной информации об ошибках используются команды SHOW ERRORS или SHOW WARNINGS. Пример:

-- После ошибочного запроса:
SHOW ERRORS;
-- Или для получения кода, сообщения и уровня:
SHOW ERRORS LIMIT 1;

В отличие от PHP, в MySQL детализация часто настраивается на уровне сессии или сервера через системные переменные.

Распространенные ошибки
Передача неверного уровня детализации

Код:

$conn = pg_connect('host=localhost dbname=test');
$res = pg_set_error_verbosity($conn, 99); // Несуществующая константа
var_dump($res);

Результат:

bool(false)
Использование без активного соединения

Код:

$res = pg_set_error_verbosity(null, PGSQL_ERRORS_VERBOSE);
var_dump($res);

Результат:

bool(false)

В таких случаях следует проверять возвращаемое значение и наличие соединения с помощью pg_connection_status().

Изменения в версиях PHP

В PHP 8.0 серьезных изменений в работе функции pg_set_error_verbosity() не было. Поведение и сигнатура функции остались совместимыми с предыдущими версиями. Начиная с PHP 5.1.0, параметр connection является необязательным. В более ранних версиях он был обязательным.

Расширенные примеры
Динамическое изменение уровня детализации

Код:

Пример php
function executeQueryWithVerbosity($conn, $query, $verbosity) {
    $oldVerbosity = pg_set_error_verbosity($conn, $verbosity);
    $result = pg_query($conn, $query);
    pg_set_error_verbosity($conn, $oldVerbosity); // Восстановление
    return $result;
}
$conn = pg_connect('host=localhost dbname=test');
$res = executeQueryWithVerbosity($conn, 'SELECT 1/0', PGSQL_ERRORS_VERBOSE);
if (!$res) {
    echo pg_last_error($conn);
}
Логирование ошибок с разным уровнем детализации

Код:

Пример php
$logDetail = (ENVIRONMENT == 'development') ? PGSQL_ERRORS_VERBOSE : PGSQL_ERRORS_TERSE;
pg_set_error_verbosity($conn, $logDetail);
$result = pg_query($conn, 'INVALID SQL');
if (!$result) {
    error_log('DB Error: ' . pg_last_error($conn));
}
Обработка ошибок в транзакции

Код:

Пример php
pg_set_error_verbosity($conn, PGSQL_ERRORS_VERBOSE);
pg_query($conn, 'BEGIN');
$res1 = pg_query($conn, 'INSERT INTO users (name) VALUES (\'John\')');
$res2 = pg_query($conn, 'INSERT INTO posts (user_id, title) VALUES (999, \'Test\')'); // Ошибка FK
if (!$res1 || !$res2) {
    $error = pg_last_error($conn);
    pg_query($conn, 'ROLLBACK');
    // Анализ $error для определения причины
} else {
    pg_query($conn, 'COMMIT');
}

PHP pg_set_error_verbosity function comments

En
Pg set error verbosity Determines the verbosity of messages returned by pg_last_error and pg_result_error