【问题标题】:psycopg2 - Using SQL object with execute_valuespsycopg2 - 使用带有 execute_values 的 SQL 对象
【发布时间】: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


【解决方案1】:

execute_values(cur, sql, argslist, template=None, page_size=100) 中的参数sql 应该是一个字符串:

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()

【讨论】:

    【解决方案2】:

    由于execute_values() 期望 sql 语句是一个字符串,您可以简单地使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 2021-03-03
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      相关资源
      最近更新 更多