0

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

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一次执行多个查询? 注意: idsinteresting_users没有顺序,所以我不能使用类似的东西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()
4

1 回答 1

2

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() 
于 2018-05-14T16:32:05.293 回答