Skip to main content
 首页 » 编程设计

python之检查 sqlalchemy.engine.result.ResultProxy> 对象是否为空

2025年05月04日26zengkefu

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