1

在我的程序中,当我很长时间没有运行数据库更新然后尝试更新我的数据时,我的 sqlalchemy 脚本会生成一个 postgresql upsert 查询,其中 >4000 个参数,每个参数 >8 个项目。

当执行查询时,databases.Database.execute(query)我最终出现此错误:

asyncpg.exceptions._base.InterfaceError: the number of query arguments cannot exceed 32767

我的想法是根据参数的数量作为阈值自动拆分查询,并分两部分执行并合并结果。

你知道如何解决这个问题吗?

4

1 回答 1

0

我最终通过在我的参数字典列表中获取第一个参数的字典键的长度来检查查询参数的数量,因为它们都具有相同数量的键=每个列表项的参数:

args_per_row = len(args_dict_list[0])

PSQL_QUERY_ALLOWED_MAX_ARGS = 32767

allowed_args_per_query = int(math.floor(PSQL_QUERY_ALLOWED_MAX_ARGS/args_per_row))

然后我将 args_dict_list 分成每个查询允许的 args 大小的部分:

query_args_sets = [
    args_dict_list[x:x + allowed_args_per_query] for x in range(
        0,
        len(args_dict_list),
        allowed_args_per_query
    )
]

最后遍历 query_args_sets 并为每个集合生成并执行一个单独的查询:

for arg_set in query_args_sets:
    query = query_builder.build_upsert(values=arg_set)
    await database.execute(query)
于 2020-09-25T12:20:45.477 回答