Правильное поведение libpq PQexecPrepared и SQL EXECUTE - PullRequest
0 голосов
/ 12 июня 2018

Похоже, что с postgres есть два способа подготовить и выполнить подготовленные операторы.Вы можете использовать функции PQprepare и PQexecPrepared непосредственно из libpq;или вы можете выдавать операторы SQL: PREPARE и EXECUTE.Имена операторов одинаковы для любого метода, поэтому вы можете использовать PQPrepare для подготовки оператора, а затем выполнить его, выполнив запрос EXECUTE (или использовать запрос PREPARE, а затем выполнить его с помощью PQexecPrepared).

Таким образом, два подхода (библиотечные функции и SQL-запросы) эквивалентны.Однако, похоже, что при использовании PQexecPrepared столбец query в pg_stat_activity является основным подготовленным оператором с заполнителями.Так что-то вроде:

SELECT * from users where name in ($1, $2, $3);

Но когда вы используете запрос EXECUTE, pg_stat_activity содержит SQL EXECUTE, например:

EXECUTE user_query('joe', 'bob', 'sally');

Вопросы

  1. Есть ли способ получить одинаковые выходные данные для двух разных способов выполнения подготовленных операторов?
  2. Есть ли способ увидеть и запрос, и связанные параметры при выполнении подготовленных операторов?

1 Ответ

0 голосов
/ 12 июня 2018

Вы правы, что оба способа выполнения подготовленного оператора делают одно и то же внутри, но поскольку они вызываются по-разному на уровне SQL, они выглядят по-разному в pg_stat_activity.Нет способа изменить это.

Чтобы получить оператор и параметров, вы должны прибегнуть к файлу журнала.

В случае PQexecPrepared вывы увидите оператор как сообщение LOG, а параметры - как DETAIL, если вы включите ведение журнала операторов.

С PREPARE и EXECUTE у вас нет выбора, кроме как найти PREPARE ранее в сеансе (оба имеют одинаковый идентификатор сеанса, то есть %c в log_line_prefix).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...