我正在通过一个利用 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))
