使用psycopg2执行SELECT查询

时间:2018-05-14 16:25:43

标签: python postgresql select psycopg2 executemany

我有一个很大的postgresql数据库用户,我使用psycopg2连接。我需要检索(SELECT)特定大型用户子集(> 200)的信息。我收到了一个id列表,我需要返回每个用户的age。我提出了一个有效的解决方案:

conn = psycopg2.connect("dbname= bla bla bla")
cur = conn.cursor()

for user_id in interesting_users:
    qr =  "SELECT age FROM users WHERE country_code = {0} AND user_id = {1}".format(1, user_id)
    cur.execute(qr)
    fetched_row = cur.fetchall()
    #parse results

此解决方案工作正常,但当interesting_users的长度很大时,它并不理想。我正在寻找一种比执行多个查询更有效的方法。一种解决方案是通过附加所有用户ID来创建单个查询:

for user_id in interesting_users:
    query += "OR user_id {0}".format(user_id)

但我希望有一个更优雅的解决方案。

我发现psycopg2提供了executemany()方法。所以,我试图解决我的问题。但是,我无法使其发挥作用。这样:

cur.executemany("SELECT age FROM users WHERE country_code = %s AND user_id = %s",[(1, user_id) for user_id in interesting_users])
r = cur.fetchall() 

返回:

r = cur.fetchall()
psycopg2.ProgrammingError: no results to fetch

那么,executemany()语句可以使用SELECT吗?如果是的话,我的代码有什么问题?如果不是,我如何一次执行多个SELECT查询? 注意interesting_users中的ID没有订单,因此我无法使用WHERE id < ...

之类的内容

query =  "SELECT age FROM users WHERE country_code = {0} AND user_id IN ({1});".format(1, ",".join(map(str, interesting_users)))
cur.execute(query)
fetched_rows = cur.fetchall()

1 个答案:

答案 0 :(得分:1)

executemany仅适用于INSERT,而非SELECT。使用IN

cur.executemany("SELECT age FROM users WHERE country_code = %s AND user_id IN ({})".format(','.join(['%s'] * len(interesting_users)),
    [1] + interesting_users)
r = cur.fetchall()