簡體   English   中英

檢查是否<sqlalchemy.engine.result.ResultProxy>對象為空

[英]Check if <sqlalchemy.engine.result.ResultProxy> object is empty

我正在通過一個在后端利用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對象耗盡之前,您無法知道 fethced 行的數量。

方法#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))

SQLAlchemy < 1.2:您始終可以將 ResultProxy 轉換為迭代器:

res = engine.execute(...)
rp_iter = iter(res)
row_count = 0
try:
    row = next(rp_iter)
    row_count += 1
except StopIteration:
    # end of data
    if not row_count:
      # no rows returned, StopIteration was raised on first attempt

SQLAlchemy >= 1.2 中, ResultProxy 實現了.next().__next__() ,所以你不需要創建迭代器:

res = engine.execute()
row_count = 0
try:
    row = next(res)
    row_count += 1
except StopIteration:
    ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM