psycopg2 - использование объекта SQL с execute_values - PullRequest
0 голосов
/ 15 сентября 2018

Я вставляю данные, используя execute_values, который принимает запрос sql. Запрос строится с использованием psycopg2.sql.SQL, как рекомендовано в документации, но execute_values ​​не будет принимать этот объект.

Вот код, который у меня есть:

import psycopg2 as pg
from psycopg2 import extras
from psycopg2 import sql

config = {
    'host' : 'localhost',
    'user' : 'username',
    'password' : 'password',
    'dbname' : 'myDatabase'
}

connection = pg.connect(**config)
cursor = connection.cursor()

tableName = 'myTable'
dataset = [[1,2],[3,4],[5,6]]

queryText = "INSERT INTO {table} (uid,value) VALUES %s"
query = sql.SQL(queryText).format(table=sql.Identifier(tableName))

extras.execute_values(cursor,query,dataset)

Последняя строка выдает следующую ошибку:

AttributeError: 'Composed' object has no attribute 'encode'

Если запрос указан непосредственно в виде строки, как показано ниже, то выполнение выполняется.

query = """INSERT INTO "myTable" (uid,value) VALUES %s"""

Возможно вставить имя таблицы в запрос, используя строковый формат, но очевидно, что не следует делать, даже под дулом пистолета . Как можно безопасно вставить имя переменной таблицы в запрос и использовать execute_values? Я не могу найти встроенный способ преобразования объекта SQL в строку.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Как execute_values() ожидаем, что оператор sql будет строкой, которую вы можете просто использовать:

 queryText = "INSERT INTO {table} (uid,value) VALUES %s".format(table=sql.Identifier(tableName)
0 голосов
/ 16 сентября 2018

Параметр sql в execute_values(cur, sql, argslist, template=None, page_size=100) должен быть строкой:

sql - запрос для выполнения. Он должен содержать один заполнитель% s, который будет заменен списком VALUES. Пример: «INSERT INTO mytable (id, f1, f2) VALUES% s».

Используйте метод as_string(context):

extras.execute_values(cursor, query.as_string(cursor), dataset)
connection.commit()
...