错误:列表中的最大表达式数为 1000,如何修改下面的代码以获取超过 1000 条记录?

问题描述 投票:0回答:1

我有下面的代码,我知道我可能很接近,但我仍然收到我已经超过 1000 的错误。

我添加了generate_sql_in_binds函数,但我想我不知道如何正确传递它。

from datetime import datetime

hour_dt = tuple(datetime.strptime(value, "%m/%d/%Y %H:%M") for value in hour)

def generate_sql_in_binds(
    name: str,
    size: int,
    start: int = 1,
    max_binds: int = 1000,
) -> str:
    in_clauses = (
        "{name} IN ({binds})".format(
            name=name,
            binds=",".join(
                (
                    f":{b+start}"
                    for b in range(i, min(i+max_binds,size))
                )
            )
        )
        for i in range(0, size, max_binds)
    )
    return "(" + (" OR ".join(in_clauses)) + ")"

query = """SELECT HOUR, UNITSCHEDULEID, VERSIONID, MINRUNTIME
FROM  int_Stg.UnitScheduleOfferHourly
WHERE Hour in ({hour_binds})
AND   UnitScheduleId in ({id_binds})""".format(
  hour_binds=",".join((f":{idx}" for idx, _ in enumerate(hour, 1))),
  id_binds=",".join((f":{idx}" for idx, _ in enumerate(unitid, len(hour) + 1))),
)

res = connection.cursor().execute(query, (*hour_dt, *unitid)).fetchall()
print(res)
python sql cx-oracle
1个回答
0
投票

这里需要更多关于“小时”和“unitid”列表的上下文。然而,最好的方法是将它们保存在数据库的另一个表中。如果您担心使用联接的性能,您还可以在需要的地方添加子查询。示例:

query = """SELECT HOUR, UNITSCHEDULEID, VERSIONID, MINRUNTIME
FROM  int_Stg.UnitScheduleOfferHourly
WHERE Hour in (select hour in hours_table)
AND   UnitScheduleId in (select unitid from unitids_table)"""
© www.soinside.com 2019 - 2024. All rights reserved.