【发布时间】:2019-02-19 19:18:00
【问题描述】:
我正在使用 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"""
可以使用字符串格式将表名插入到查询中,但显然shouldn't be done, even at gunpoint。如何安全地将变量表名插入查询并使用 execute_values?我找不到将 SQL 对象转换为字符串的内置方法。
【问题讨论】:
-
哪一行给你错误?
-
我认为它不起作用的原因之一是因为它通常是不应该做的事情。您应该知道要向哪个表中插入数据。在我看来,也许您正在尝试将 sql 数据库用作键值数据库,这意味着您正在尝试以不应该使用的方式使用它?您能否解释一下您为什么要这样做或要达到什么目的?
-
@pacuna - 最后一行给出了错误。所指的“对象”是查询,它不能像字符串一样编码,因为它没有那个方法
-
@JanSpurny - 该脚本用于将文件中的数据导入用户选择的表中。这是 psycopg2 的正常操作,请参阅 initd.org/psycopg/docs/sql.html。问题是 pscycopg2.sql 的查询检查没有扩展到多值执行。
标签: python sql database postgresql psycopg2