当UPDATE没有受影响的行时,SQLAlchemy ResultProxy.rowcount不为零

时间:2012-06-11 14:35:47

标签: python mysql sqlalchemy

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

如果我使用SQLAlchemy执行此查询:

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

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

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

感谢。

1 个答案:

答案 0 :(得分:0)

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

  

对于UPDATE语句,默认情况下受影响的行值为   实际更改的行数。如果你指定   连接时CLIENT_FOUND_ROWS标记为mysql_real_connect()   mysqld,受影响的行值是“找到”的行数;那   是,与WHERE子句匹配。

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

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

关于与sqlalchemy的关系,我不确定它是否是一个错误,或者仅需要使用更好的措辞来更新文档。
在任何情况下,您都可以通过在语义上重写SQL语句来解决问题:

UPDATE  table
SET     field = 10
WHERE   id = 1
    AND field < 10