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)
当我遇到一个奇怪的行为时,我正在使用 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)