我有一个很大的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()
答案 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()