我有一个关于 Python 和 sqlalchemy 模块的问题。 sqlalchemy Python 中的
cursor.rowcount
相当于什么?
ResultProxy
对象也具有 rowcount
属性。
实际上,对于某些数据库(例如 postgres),没有办法准确地知道这一点。 最接近的是
rowcount
。但
rowcount
是不是受影响的行数。它是匹配行的数量。看看doc说什么 此属性返回
匹配的行数,这不一定与实际修改的行数相同 - 例如,如果 SET 值,则 UPDATE 语句可能对给定行没有净更改给出的内容与该行中已经存在的内容相同。这样的行将被匹配但不会被修改。在具有两种风格的后端(例如 MySQL)上,
因此,对于以下两种情况rowcount
默认配置为在所有情况下返回匹配计数
rowcount
都会报告
1
。因为Rows matched: 1
update
语句更改了一行。
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
update
语句。
Query OK, 0 row affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
进一步推动讨论,这里是如何使用 MySQL 的 sqlalchemy 显示
updated 行计数而不是 matched 行计数:需要使用标志 client_flag=0
创建引擎。
from sqlalchemy import create_engine
engine = create_engine(
'mysql+pymysql://user:password@host:port/db',
connect_args={'client_flag':0}
)
为了提供更多详细信息,MySQL 返回的
rowcount
取决于提供给 C-API 函数
CLIENT_FOUND_ROWS
的 mysql_real_connect()
标志,如 MySQL 文档中所述: 对于 UPDATE 语句,affected-rows 值默认是实际更改的行数。如果在连接到 mysqld 时为 mysql_real_connect() 指定 CLIENT_FOUND_ROWS 标志,则受影响的行值是“找到”的行数;即通过 WHERE 子句进行匹配。
MySQL 常量标志值为 2(
),并在创建 engine
时由 sqlalchemy 自动添加,如
此处所示。
client_flag
中的
connect_args
值允许覆盖此值。注意:这可能会破坏 sane_rowcount
(显然仅在 ORM 中使用) - 就我而言,我只使用 sqlalchemy 的核心。在最后一个链接中:
# FOUND_ROWS must be set in CLIENT_FLAGS to enable
# supports_sane_rowcount.
UPDATE table
SET column_to_be_changed = "something different"
WHERE column_to_be_changed != "something different" AND [...your other conditions...]
rowcount
将返回受影响的行数,因为它等于匹配的行数。
insertstmt = insert(mytable).values(myvalues).returning(mytable.c.mytableid)
with get_engine().begin() as conn:
result = conn.execute(insertstmt)
print(result.rowcount)