sql-server - 当在 mssql 上更新记录时,sqlalchemy 返回 -1

标签 sql-server sqlalchemy rowcount

我正在使用 flask-sqlalchemy 更新 mssql 记录,但它返回 -1。

库版本:

  1. SQLAlchemy 1.3.11
  2. Flask-SQLAlchemy 2.4.1
  3. pyodbc 4.0.27
  4. flask 1.1.1

代码第 1 部分:

ret = db.session.query(XXX).filter_by(id=1).update({"xxx": "xxxx"})
print("ret", ret)
db.session.commit()

ret为-1,但记录已被修改。

代码第 2 部分:

obj = XXX.query.filter_by(id=q).first()
obj .xx = "xxx"
db.session.commit()

引发错误:

sqlalchemy.orm.exc.StaleDataError: UPDATE statement on table 'XXX' expected to update 1 row(s); -1 were matched.

修改没有成功

最佳答案

根据 SQLAlchemy documentation,目前某些版本的 SQL Server 驱动程序存在限制,无法返回 UPDATE 和 DELETE 语句的记录数。我目前在 Linux 上遇到这个问题,但它在 Windows 上运行良好。

这里还有一个related SQL Alchemy issue

我将该列用作版本指示器(文档建议创建一个 SQLServer ROWVERSION,但是,SQLAlchemy/PyODBC,同样在 Linux 上,无法从数据库中将正确的 FetchedValues() 作为字节分配到字段中。我也尝试过使用 DateTime2 字段 - 然而,在将字段映射到 Python 时再次用于 SQLAlchemy 的准确性(7 精度)

我最终实现了以下更改:

因为数据库已经分配了 ID 列 (IDENTITY),所以我使用该字段作为版本指示符。

    __mapper_args__ = {
        'version_id_col': id_column,
        'version_id_generator': False,
    }

SQLAlchemy 更新语句现在看起来像:

UPDATE <TABLE> SET <column>=? OUTPUT inserted.<ID-COLUMN> WHERE <TABLE>.<ID-COLUMNS> <ID-COLUMN> = ? AND <TABLE>.<ID-COLUMN> = ?

[('updated data', 123456, 123456)]

关于sql-server - 当在 mssql 上更新记录时,sqlalchemy 返回 -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59064341/

相关文章:

sql-server - 我可以从 .NET 获取 SqlCommand 对象(带有 SQL 参数)生成的完整 SQL 字符串吗?

sql-server - Select 子句中的 bool 逻辑

python - 在 Flask-SqlAlchemy 中连接表

python - 为什么 Elixir/SQLAlchemy 的 session.bind 在线程内设置为 None?

sql - @@ROWCOUNT 的正确类型是什么?

node.js - 如何在 Node.js 中的 DB2 更新查询中获取行更新计数?

php - 错误 : number of bound variables does not match number of tokens

sql-server - 自动删除 SQL Server 中的旧存储过程

sql - 单列 SQL 上的多个计数

python - 唯一约束验证的最佳实践