Новый модуль sql
был создан для этой цели и добавлены в psycopg2 версии 2.7. В соответствии с документацией:
Если вам нужно динамически генерировать SQL-запрос (например, динамически выбирая имя таблицы), вы можете использовать средства, предоставляемые модулем psycopg2.sql.
Два примера приведены в документации: http://initd.org/psycopg/docs/sql.html
names = ['foo', 'bar', 'baz']
q1 = sql.SQL("insert into table ({}) values ({})").format(
sql.SQL(', ').join(map(sql.Identifier, names)),
sql.SQL(', ').join(sql.Placeholder() * len(names)))
print(q1.as_string(conn))
вставки в таблицу ("Foo", "бар", "Баз") значения (% S,% S,% s)
q2 = sql.SQL("insert into table ({}) values ({})").format(
sql.SQL(', ').join(map(sql.Identifier, names)),
sql.SQL(', ').join(map(sql.Placeholder, names)))
print(q2.as_string(conn))
вставки в таблицу ("Foo", "бар", "Баз") значения (% (Foo) с,% (бар) с,% (БАЗ) с)
Хотя конкатенация приведет к тому же результату, что не следует использовать для этой цели, в соответствии с psycopg2 документации:
Предупреждение: Никогда, никогда, НИКОГДА не использование Python конкатенация строк (+
) или интерполяция параметров строк (%
) для передачи переменных в строку запроса SQL. Даже под дулом пистолета.
Я бы также заменил 'cols' на' [cursor.mogrify (x) для x в cols] 'и тот же для' vals_str', чтобы помешать SQL-инъекциям. – 9000
Согласился, что это, безусловно, добавит дополнительной защиты. – khampson
Чтение документа psycopg2 немного, 'mogrify' может быть ненужным, так как определение этого метода говорит о том, что ** Возвращенная строка является именно той, которая будет отправлена в базу данных, где выполняется метод execute() или аналогичный. ** , поэтому я думаю, что столбцы и строки '% s' будут« mogrify »во время вызова' execute'. – khampson