使用pygresql(pg模块)在语句中执行SQL select
Execute SQL select in statement using pygresql(pg module)
我正在编写 python 脚本以使用 pygresql 模块连接到 postgress 数据库。下面是代码
我正在尝试 运行 通过将元组作为参数传递给查询。
查询如下所示:
select sum(column1) from table_name where column2 in %s,(tuple,).
但我一直收到错误 "ERROR: syntax error at or near "%"".
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 模块。
请帮忙。
请用“?” SQL select 命令中的符号
在你的情况下,你应该修改为:
conn.query('select sum(column1) from table_name where column2 in
?',(tup_ids,))
然后它应该执行成功
PyGreSQL "classic"(pg 模块)在其 query
方法中支持 PostgreSQL 本机参数,标记为 </code>、<code>
, ... 不幸的是,它们只接受单独的值,因此您必须首先构造一个参数列表,其中的值与您的元组一样多。不过这很简单:
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
包装器 class 中可用的 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 injection"),即使它看起来更简单:
con = pg.connect(cs) # do NOT do this:
q = con.query('select sum(column1) from table_name where column2 in %s' % (tup_ids,))
我正在编写 python 脚本以使用 pygresql 模块连接到 postgress 数据库。下面是代码
我正在尝试 运行 通过将元组作为参数传递给查询。 查询如下所示:
select sum(column1) from table_name where column2 in %s,(tuple,).
但我一直收到错误 "ERROR: syntax error at or near "%"".
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 模块。 请帮忙。
请用“?” SQL select 命令中的符号
在你的情况下,你应该修改为:
conn.query('select sum(column1) from table_name where column2 in ?',(tup_ids,))
然后它应该执行成功
PyGreSQL "classic"(pg 模块)在其 query
方法中支持 PostgreSQL 本机参数,标记为 </code>、<code>
, ... 不幸的是,它们只接受单独的值,因此您必须首先构造一个参数列表,其中的值与您的元组一样多。不过这很简单:
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
包装器 class 中可用的 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 injection"),即使它看起来更简单:
con = pg.connect(cs) # do NOT do this:
q = con.query('select sum(column1) from table_name where column2 in %s' % (tup_ids,))