Я вставляю данные, используя 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 в строку.