我正在通过使用后端中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))

09-27 05:58