我正在通过使用后端中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
不幸的是,即使SQL查询未返回任何行,
result
也永远不会是None
。最好的检查方法是什么?
最佳答案
ResultProxy
对象尚不包含任何行。因此,它没有有关它们的总量,甚至是否有任何信息。 ResultProxy
只是数据库的“指针”。仅当通过ResultProxy
显式获取行时,您才能获得行。您可以通过对该对象进行迭代,通过.first()
方法或通过.fetchall()
方法来实现。
底线:只有在实际提取所有它们并且ResultProxy
对象用尽之前,您才能知道有排行的数量。
方法1
您可以一次获取所有行,然后对它们进行计数,然后对它们进行任何操作:
rows = result.fetchall()
if len(rows):
# do something with rows
该方法的缺点是我们将所有行一次加载到内存中(
rows
是包含所有已获取行的Python list
)。如果获取的行的数量非常大和/或仅需要独立地逐行迭代行(通常就是这种情况),则可能不希望这样做。方法#2
如果将所有提取的行一次加载到内存中是不可接受的,那么我们可以这样做:
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))