0

我正在尝试使用核心 SQLAlchemy 对 postgres 数据库进行批量更新。bulk_update_mappings 不起作用(报告 StaleDataError)。所以我正在尝试使用核心功能进行批量更新。当传递给值的更新数据具有数据库中的所有列但当我们仅更新某些列时无法正常工作时,这可以正常工作。在我的应用程序中,在服务器和客户端之间的定期同步期间,大多数时候只有少数列会得到更新。

我要更新的代码片段是:

    conn = session.connection()
    table = table_dict[table_key].__table__
    stmt=table.update().where(and_(table.c.user_id==bindparam('uid'),
    tbl_pk[table_key]==bindparam('pkey'))).values()
    conn.execute(stmt, update_list)

由于我在每次同步时更新多个表,因此表名和主键通过数组进行索引。对于下面的示例,table_dict[table_key] 将转换为表“nwork”,tbl_pk[table_key] 将转换为“table.c.nwid”,即“nwork.nwid”。

update_list 是作为 python 字典的记录列表(需要更新)。当记录具有所有列的值时,它可以正常工作,并且当只有部分列正在更新时,它会引发以下错误:

    StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter 'last_sync', in parameter group 1 
    [SQL: u'UPDATE nwork SET type=%(type)s, name=%(name)s, last_sync=%(last_sync)s, 
    update_time=%(update_time)s, status=%(status)s, total_contacts=%(total_contacts)s, 
    import_type=%(import_type)s, cur_index=%(cur_index)s WHERE 
    nwork.user_id = %(uid)s AND nwork.nwid = %(pkey)s']

在这种情况下,错误发生在 last_sync 未更新的记录中。

在记录可能没有更新所有列(同一组)的情况下进行批量更新的方式是什么?我无法从 SQLAlchemy 的 Update.values() 文档中找到太多信息。

我正在运行 SQLAlchemy 1.0.14。

4

0 回答 0