如何获取sqlalchemy中受影响的行数?

问题描述 投票:0回答:5

我有一个关于 Python 和 sqlalchemy 模块的问题。 sqlalchemy Python 中的

cursor.rowcount
相当于什么?

python sqlalchemy
5个回答
46
投票

ResultProxy
对象也具有
rowcount
属性。


32
投票

实际上,对于某些数据库(例如 postgres),没有办法准确地知道这一点。 最接近的是

rowcount

。但

rowcount
不是
受影响的行数。它是匹配行的数量。看看doc说什么

此属性返回
匹配

的行数,这不一定与实际修改的行数相同 - 例如,如果 SET 值,则 UPDATE 语句可能对给定行没有净更改给出的内容与该行中已经存在的内容相同。这样的行将被匹配但不会被修改。在具有两种风格的后端(例如 MySQL)上,rowcount 默认配置为在所有情况下返回匹配计数


因此,对于以下两种情况
rowcount

都会报告

1
。因为
Rows matched: 1

  1. update

    语句更改了一行。

     Query OK, 1 row affected (0.00 sec)
     Rows matched: 1  Changed: 1  Warnings: 0
    

  2. 执行相同的
  3. update

    语句。

     Query OK, 0 row affected (0.00 sec)
     Rows matched: 1  Changed: 0  Warnings: 0
    

    
        

6
投票

进一步推动讨论,这里是如何使用 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 子句进行匹配。

标志值为 2(
MySQL 常量

),并在创建 engine 时由 sqlalchemy 自动添加,如

此处
所示。

client_flag

中的

connect_args
值允许覆盖此值。
注意:这可能会破坏 

sane_rowcount

(显然仅在 ORM 中使用) - 就我而言,我只使用 sqlalchemy 的核心。在最后一个链接中:

# FOUND_ROWS must be set in CLIENT_FLAGS to enable
# supports_sane_rowcount.



2
投票

UPDATE table SET column_to_be_changed = "something different" WHERE column_to_be_changed != "something different" AND [...your other conditions...]

然后
rowcount

将返回受影响的行数,因为它等于匹配的行数。

    


2
投票

insertstmt = insert(mytable).values(myvalues).returning(mytable.c.mytableid) with get_engine().begin() as conn: result = conn.execute(insertstmt) print(result.rowcount)

	
© www.soinside.com 2019 - 2024. All rights reserved.