SQLalchemy rowcount 对于语句总是 -1

SQLalchemy rowcount always -1 for statements

当我遇到一个奇怪的行为时,我正在使用 SQLalchemy 和 Microsoft SQL Server 来掌握这些功能。我被告知结果代理对象上的属性 rowcount 将告诉有多少行受到执行语句的影响。但是,当我 select 或在我的测试数据库中插入单行或多行时,我总是得到 -1。这怎么可能?我该如何解决这个问题以反映现实?

connection = engine.connect()
metadata = MetaData()

# Ex1: select statement for all values
student = Table('student', metadata, autoload=True, autoload_with=engine)
stmt = select([student])
result_proxy = connection.execute(stmt)
results = result_proxy.fetchall()
print(result_proxy.rowcount)

# Ex2: inserting single values
stmt = insert(student).values(firstname='Severus', lastname='Snape')
result_proxy = connection.execute(stmt)
print(result_proxy.rowcout)
 
# Ex3: inserting multiple values 
stmt = insert(student)
values_list = [{'firstname': 'Rubius', 'lastname': 'Hagrid'},
               {'firstname': 'Minerva', 'lastname': 'McGonogall'}]
result_proxy = connection.execute(stmt, values_list)
print(result_proxy.rowcount)

每个块的打印函数分别 运行 示例代码打印 -1。 Ex1 成功获取所有行,并且两个插入语句都成功将数据写入数据库。

根据以下问题,rowcount 属性并不总是可信的。这里也是这样吗?什么时候,我如何用 SQLalcehmy 交易中的 Count 语句进行补偿? PDO::rowCount() returning -1

单行 INSERT … VALUES ( … ) 是微不足道的:如果语句成功,则一行受到影响,如果失败(抛出错误),则零行受到影响。

对于多行 INSERT 只需在事务中执行它,如果发生错误则回滚。那么受影响的行数将为零或 len(values_list).

要获取 SELECT return 的行数,请将 select 查询包装在 SELECT count(*) 中query and 运行 that first,例如:

select_stmt = sa.select([Parent])
count_stmt = sa.select([sa.func.count(sa.text("*"))]).select_from(
    select_stmt.alias("s")
)
with engine.connect() as conn:
    conn.execution_options(isolation_level="SERIALIZABLE")
    rows_found = conn.execute(count_stmt).scalar()
    print(f"{rows_found} row(s) found")
    results = conn.execute(select_stmt).fetchall()
for item in results:
    print(item.id)