Выберите строки из базы данных, используя различные условия WHERE - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть карта, на которой нарисованы лоты, когда человек выбирает один или несколько лотов, я хочу получить информацию об этих лотах из базы данных и вернуть ее. Лоты идентифицируются по идентификаторам, подобным тем, которые указаны в "lots_list". В настоящее время я использую для l oop для итерации по списку и извлечения данных, передавая идентификатор предложению where с заполнителем, но при этом выполнение выполняется довольно медленно.

def getLotInfo(lots_list):

    lots = []
    for lot in lots_list:
        try:
            connection = psycopg2.connect(user=user,
                                          password=password,
                                          host=host,
                                          port=port,
                                          database=database)
            cursor = connection.cursor()

            Psql_Query = '''SELECT setor, quadra, lote, area_ocupada FROM iptu_sql_completo WHERE sql 
                            LIKE %s'''

            cursor.execute(Psql_Query, (lot,))
            lots.append(cursor.fetchone())
            print(lots)

        except (Exception, psycopg2.Error) as error:
            print("Error fetching data from PostgreSQL table", error)

        finally:
            # closing database connection.
            if (connection):
                cursor.close()
                connection.close()
                print("PostgreSQL connection is closed")

    return lots


lots_list = ["0830480002", "0830480003", "0830480004"]

Lots = getLotInfo(lots_list)

Я пытался использовать команду psycopg2 execute_batch

        Psql_Query = '''SELECT setor, quadra, lote, area_ocupada FROM 
                        iptu_sql_completo WHERE sql LIKE %s'''

        ppgextra.execute_batch(cursor, Psql_Query, SQLs)

        lots.append(cursor.fetchall())
        print(lots)

, но я получаю следующую ошибку "не все аргументы преобразованы во время форматирования строки". Мне кажется, это потому, что я должен использовать заполнитель в запросе для каждого элемента в список, но если список когда-либо меняется в размере, будет ли способ исправить это? Идентификаторы не всегда последовательны.

Мой вопрос: есть ли способ добиться лучшей производительности, чем использование для l oop?

1 Ответ

0 голосов
/ 07 мая 2020

Ваш текущий код в значительной степени худший случай, который я имел в виду:

Морис уже упомянул повторные издержки соединения. Но даже при одном подключении это далеко от идеала. Вместо этого запустите один запрос и передайте весь список lots_list как Postgres массив :

SELECT setor, quadra, lote, area_ocupada
FROM   iptu_sql_completo
WHERE  sql = ANY (%s);

Связанные:

...