我正在使用python脚本使用pygresql模块连接到postgress数据库。下面是代码
我试图通过将元组作为参数来运行查询。 查询看起来像这样:
select sum(column1) from table_name where column2 in %s,(tuple,).
但是我一直收到错误消息“ ERROR:语法错误在或接近“%””。
import pg
tup_ids=('a','b','c')
def connection(cs):
"""
:param cs: cs is connection string
:return:
"""
conn=pg.connect(cs)
return conn
conn1 = connection(conn_string)
conn1.query('select sum(column1) from table_name where column2 in %s',(tup_ids,).
我能够使用psycopg2模块执行查询。我无法为pg模块传递元组参数。我一直是pgresql文档。我不确定我在哪里做错了。
仅供参考:我只需要使用pygresql模块。 请帮忙。
答案 0 :(得分:3)
PyGreSQL“经典”(pg模块)在其query
方法中支持PostgreSQL本机参数,标记为$1
,$2
,...不幸的是,这些仅接受单个值,因此您必须首先构造一个具有与元组一样多的值的参数列表。不过,这很简单:
con = pg.connect(cs)
p_list = ','.join('$%d' % n for n in range(1, len(tup_ids) + 1))
q = con.query('select sum(column1) from table_name where column2 in (%s)' % p_list, tup_ids)
print(q.getresult())
或者,您可以使用PyGreSQL classic的DB
包装器类中可用的query_formatted
方法(无论如何,建议使用该包装器而不是原始连接,因为它增加了许多便利方法)。此方法使用Python格式,因此必须这样使用:
db = pg.DB(cs)
p_list = ','.join(['%s'] * len(tup_ids))
q = db.query_formatted(
'select sum(column1) from table_name where column2 in (%s)' % p_list, tup_ids)
print(q.getresult())
通过在SQL语句中使用ANY
而不是IN
,您可以避免创建参数列表,并将值作为单个列表传递:
db = pg.DB(cs)
q = db.query_formatted(
'select sum(column1) from table_name where column2 = any(%s)', [list(tup_ids)])
print(q.getresult())
PyGreSQL DB API 2模块(pgdb)也使用Python格式,并且工作方式类似:
con = pgdb.connect(cs)
cur = con.cursor()
cur.execute('select sum(column1) from table_name where column2 = any(%s)', [list(tup_ids)])
print(cur.fetchone())
请注意,我们总是分别传递参数。不要试图让 传递带有Python格式的值的查询,因为这看起来容易出错并且存在安全问题(“ SQL注入”),即使看起来更简单:
con = pg.connect(cs) # do NOT do this:
q = con.query('select sum(column1) from table_name where column2 in %s' % (tup_ids,))
答案 1 :(得分:1)
请使用“?” SQL选择命令中的符号
根据您的情况,您应该修改为:
conn.query('从table_name中选择sum(column1),其中column2在 ?',(tup_ids,))
那么它应该成功执行