2

我们有一个 MySQL 数据库,我们正在从 DB API 切换到 SQLAlchemy。从文档中, ResultProxy.rowcount 应该通过 UPDATE 语句报告受影响的行数。

如果我用 SQLAlchemy 执行这个查询:

UPDATE table
SET field =
IF(field < 10, 10, field) WHERE id = 1

如果有匹配的行,它将返回 1 的行数,但对于“字段”的任何值(即使大于或等于 10)。当我使用 DB API 执行此查询时,它返回了正确数量的受影响行(当字段大于或等于 10 时为 0,如果低于则为 1)。

这给我们带来了一些麻烦,因为我们必须首先执行一个选择查询来确定是否有更改。它是 SQLAlchemy 中的错误吗?该文档明确指出,如果应该返回受影响的行数,而不是匹配的行数。

谢谢。

4

1 回答 1

0

没有使用 MySQL 的经验,但文档ROW_COUNT()显示:

对于UPDATE语句,affected-rows 默认值是实际更改的行数。如果 在连接到时 指定CLIENT_FOUND_ROWS标志 to ,则受影响的行值是“找到”的行数;也就是说,由 WHERE 子句匹配。mysql_real_connect()mysqld

因此,根据连接的配置方式,结果可能是以下两种之一:

  • “找到”的行数(与WHERE子句匹配的行)
  • 实际“更新”的行数(其中至少一列中的值已更改)

关于与 sqlalchemy 的关系,我不确定这是一个错误还是只是需要用更好的措辞更新文档。在任何情况下,您都可以通过用另一个语义相同
的语句重写语句来解决问题:SQL

UPDATE  table
SET     field = 10
WHERE   id = 1
    AND field < 10
于 2012-06-12T07:31:07.767 回答