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 经典query_formatted
的包装器类中提供的方法DB
(无论如何建议使用该包装器而不是原始连接,因为它增加了很多方便的方法)。此方法使用 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,))