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

标签 python sqlalchemy

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

相关文章:

python - 存储过程未使用 sqlalchemy/pyodbc 提交

python - pickle 保存pygame Surface(python)

python - tf.unique 不重复索引

python - django save(commit=False) 与 full_clean

python - Flask SQLAlchemy 从查询结果中的两个连接的映射实体获取列

python - 加入 sqlalchemy 的混合属性

python - 如何解决在NOX中Pydroid安装kivymd时出错?

python - 加速 numpy.dot

sqlite - Sqlalchemy sqlite url 相对于 home 或环境变量

python - 如何将我的两个 @listens_for 事件回调重构为一个?