首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pygresql(pg模块)执行select语句

使用pygresql(pg模块)执行select语句
EN

Stack Overflow用户
提问于 2019-03-06 06:11:16
回答 2查看 1.1K关注 0票数 2

我正在编写一个python脚本,以便使用pygresql模块连接到后置数据库。下面是代码

我试图通过将tuple作为参数来运行查询。查询如下:

代码语言:javascript
复制
select sum(column1) from table_name where column2 in %s,(tuple,).

但是我一直收到错误" error :语法错误在“%”或“%”附近“。

代码语言:javascript
复制
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文档。我不知道我在哪里做错了。

FYI:我只需要使用pygresql模块。请帮帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-07 14:35:34

PyGreSQL“经典”( pg模块)在其query方法中支持PostgreSQL本机参数,标记为$1$2,.不幸的是,这些值只接受单个值,因此必须首先使用与元组相同的值构造参数列表。不过,这很简单:

代码语言:javascript
复制
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())

或者,您可以使用query_formatted经典的DB包装器类中可用的方法(建议使用该包装器而不是原始连接,因为它增加了许多方便的方法)。此方法使用Python格式,因此必须以如下方式使用:

代码语言:javascript
复制
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,可以避免创建参数列表,并将值作为单个列表传递:

代码语言:javascript
复制
db = pg.DB(cs)
q = db.query_formatted(
    'select sum(column1) from table_name where column2 = any(%s)', [list(tup_ids)])
print(q.getresult())

Python 2模块(pgdb)也使用PyGreSQL格式,并以类似方式工作:

代码语言:javascript
复制
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注入“),即使它看起来更简单:

代码语言:javascript
复制
con = pg.connect(cs)  # do NOT do this:
q = con.query('select sum(column1) from table_name where column2 in %s' % (tup_ids,))
票数 4
EN

Stack Overflow用户

发布于 2019-03-06 06:21:20

请用"?“select命令中的符号

在你的情况下,你应该修改为:

conn.query('select sum(column1)从table_name column2 in?,(tup_ids,)‘)

那么它就应该成功地执行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55016677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档