0

我有一张地图,上面有很多地段,当有人选择一个或多个地段时,我想从数据库中获取这些地段的信息并将其返回。批次由“lots_list”中的 ID 标识。目前我正在使用 for 循环遍历列表并获取数据,将 ID 传递给带有占位符的 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)

但我收到以下错误“并非所有参数都在字符串格式化期间转换”我想那是因为我应该在查询中为列表中的每个项目使用占位符,但是如果列表的大小不断变化,是否有办法解决这个问题?ID 并不总是连续的。

我的问题是:有没有办法比使用 for 循环获得更好的性能?

4

1 回答 1

0

您当前的代码几乎是我在这里想到的最糟糕的情况:

Maurice 已经提到了重复的连接开销。但即使只有一个连接,这也远非理想。相反,运行单个查询并将整个列表lots_list作为 Postgres数组传递:

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

有关的:

于 2020-05-07T01:00:41.623 回答