Я использую libpq (но потенциально могу быть готов переключиться на другую библиотеку)
У меня есть несколько похожих запросов INSERT, которые я хочу сделать, они отличаются только значениями между ними.
Я хотел бы использовать подготовленные операторы, чтобы избежать проблем с экранированием полей. Я также хочу отправить их в одном пакете, чтобы не тратить туда и обратно на каждый запрос.
Мне известны только следующие параметры:
Использовать PQExec()
с несколькими вставками, разделенными точкой с запятой: Это не позволяет подготовить операторы, поэтому мне нужно создать запрос динамически
Использовать PQexecParams()
для каждого запроса отдельно: Это приводит к проблемам из-за нескольких потраченных туда-обратно
Использовать PQprepare()
+ PQExecPrepared()
для каждого запроса в отдельности: та же проблема, что и в предыдущем
Используйте PQexecParams()
для одного запроса с несколькими вставленными строками, например INSERT INTO tablename (a,b,c) VALUES ("A", "B", "C"), ("aa", "bb", "cc")
: это немного лучше, чем первый вариант, потому что он позволяет не экранировать аргументы,но все равно требует динамического построения запроса (и в худшем случае вам придется увеличивать количество аргументов ($ 1, $ 2, $ 3) для первой строки, но ($ 4, $ 5, $ 6) для второй и т. д.)
Итак, как избежать этих недостатков?