Выполнение множества запросов SELECT с помощью psycopg2 - PullRequest
0 голосов
/ 14 мая 2018

У меня есть большая база данных postgresql пользователей, с которой я подключаюсь, используя psycopg2.Мне нужно получить (SELECT) информацию о конкретном большом подгруппе пользователей (> 200).Мне предоставляется список идентификаторов, и мне нужно вернуть 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 велика.Я ищу более эффективный подход, чем выполнение нескольких запросов.Одним из решений было бы создание одного запроса путем добавления всех идентификаторов пользователя:

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 не имеют порядка, поэтому я не могу использовать что-то вроде WHERE id < ...

SOLUTION :

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 голосов
/ 14 мая 2018

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() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...