在 SQLAlchemy 中拆分带有太多参数的查询

Split a query with too many arguments in SQLAlchemy

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

当使用 databases.Database.execute(query) 执行查询时,我得到了这个错误:

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

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

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

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

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 分成每个查询允许的参数大小的部分:

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)