我正在通过一个利用 pymssql
的库从 SQL Server 数据库下载一些数据在后端。 curson.execute("""<QUERY BODY>""")
的结果是 sqlalchemy.engine.result.ResultProxy
目的。如何检查查询结果是否为空,因此没有行?
cur = ff.sql.create_engine(server=dw.address, db=dw.BI_DW,
login=":".join([os.environ["SQL_USER"],
os.environ["SQL_PASSWD"]]))
for n in range(100):
result = cur.execute("""QUERY BODY;""")
if result:
break
不幸的是,result
永远不会None
即使 SQL 查询没有返回任何行。
检查它的最佳方法是什么?
最佳答案
ResultProxy
对象还不包含任何行。因此,它没有关于它们总量的信息,甚至没有关于它们是否存在的信息。 ResultProxy
只是一个指向数据库的“指针”。只有当您通过 ResultProxy
显式获取行时,您才能获取行。您可以通过对该对象进行迭代,或者通过 .first()
方法,或者通过 .fetchall()
方法。
底线:在您实际提取所有行并且 ResultProxy
对象耗尽之前,您无法知道提取行的数量。
方法#1
您可以一次获取所有行并对它们进行计数,然后对它们执行任何您需要的操作:
rows = result.fetchall()
if len(rows):
# do something with rows
此方法的缺点是我们会一次性将所有行加载到内存中(rows
是一个包含所有已获取行的 Python list
)。如果获取的行的数量非常大和/或如果您只需要独立地逐行迭代行(通常是这种情况),这可能不是理想的做法。
方法#2
如果一次将所有获取的行加载到内存中是 Not Acceptable ,那么我们可以这样做:
rows_amount = 0
for row in result:
rows_amount += 1
# do something with row
if not rows_amount:
print('There were zero rows')
else:
print('{} rows were fetched and processed'.format(rows_amount))
关于python - 检查 <sqlalchemy.engine.result.ResultProxy> 对象是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37700387/