Динамический SQL-запрос Psycopg2 значения проблемы - PullRequest
0 голосов
/ 20 апреля 2019

Использование Python и psycopg2 Я пытаюсь построить динамический SQL-запрос для вставки строк в таблицы.

Переменные: 1. Название таблицы 2. Список переменных имен столбцов 3. Переменный список значений, в идеале ввод нескольких строк в одном выражении

Проблемы, с которыми я столкнулся, - это обработка строковых литералов от Python до SQL и psycopg2, пытающиеся избежать того, чтобы вы подвергали свой код атакам SQL-инъекций.

Используя модуль SQL из psycopg2, я решил динамически добавлять имя таблицы и список столбцов. Однако я действительно борюсь с добавлением ЗНАЧЕНИЙ. Сначала значения помещаются в запрос как% (val) s и, похоже, буквально передаются в базу данных буквально так, что вызывает ошибку.

Во-вторых, я хотел бы иметь возможность добавлять несколько строк одновременно.

Код ниже. Вся помощь очень ценится :) 1017 *

   import psycopg2 as pg2
   from psycopg2 import sql
   conn = pg2.connect(database='my_dbo',user='***',password='***')

   cols = ['Col1','Col2','Col3']
   vals = ['val1','val2','val3']

   #Build query
   q2 = sql.SQL("insert into my_table ({}) values ({})") \
   .format(sql.SQL(',').join(map(sql.Identifier, cols)), \
   sql.SQL(',').join(map(sql.Placeholder,vals)))

Когда я печатаю эту строку как print (q2.as_string (conn)), я получаю:

вставить в my_table ("Col1", "Col2", "Col3") значения% (val1) s,% (val2) s,% (val3) s

И затем, когда я пытаюсь выполнить такую ​​строку, я получаю следующую ошибку:

ProgrammingError: синтаксическая ошибка в или около "%" LINE 1: ... ("Col1", "Col2", "Col3") значения (% (val1) s ...
^

1 Ответ

0 голосов
/ 20 апреля 2019

Хорошо, я решил это. Во-первых, используйте Literal, а не Placeholder, во-вторых, объедините значения строк в виде кортежей внутри кортежа, циклически добавьте каждый кортеж в список в виде литералов, а затем вставьте их в конце при построении запроса.

...