我们有一个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应该返回受影响的行数,而不是匹配行的数量。
感谢。
答案 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