【问题标题】:SQLAlchemy Update Operation not working when the list in the "IN" operator is huge当“IN”运算符中的列表很大时,SQLAlchemy 更新操作不起作用
【发布时间】:2020-06-14 14:44:54
【问题描述】:

我正在尝试更改 ID 在列表“list_var”中的行的值

    conn = sqlengine.connect()
    metadata = sqlalchemy.MetaData()
    Table_var= sqlalchemy.Table('Table1',metadata, autoload_with = sqlengine)
    query = sqlalchemy.update(Table_var).values(column_var=2).where(Table_var.columns.ID.in_(list_var))
    res = conn.execute(query)

当 list_var 的长度很小时,上面的代码工作得很好,但是当长度很大时,它会给出以下错误。

DBAPIError: (pyodbc.Error) ('07002', '[07002] [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error (0) (SQLExecDirectW)')

有什么解决办法吗?

【问题讨论】:

  • 如果我没记错的话,由于实现细节,mssql 将占位符的数量限制为数千个(可能与 SP 参数计数有关,即 2100)。创建和使用临时表或 TVP(大多数 Python 驱动程序不支持)。
  • 既然您要求 any 解决方法:将 list_var 分成两半并分别执行两半?

标签: python sql sql-server python-3.x sqlalchemy


【解决方案1】:

当我将列表拆分为较小的列表时,它起作用了。 下面是代码

if(len(list_var)>1000):
     chunks = [list_var[x:x+1000] for x in range(0, len(list_var), 1000)]
     for chunk in chunks:
         query = sqlalchemy.update(Table_var).values(column_var=2).where(Table_var.columns.ID.in_(chunk))
         res = conn.execute(query)

【讨论】:

    猜你喜欢
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多