![](/img/trans.png)
[英]Is it possible to read multiple result sets using a ResultProxy object in sqlalchemy?
[英]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 行的數量。
您可以一次獲取所有行並計算它們,然后對它們執行任何您需要的操作:
rows = result.fetchall()
if len(rows):
# do something with rows
這種方法的缺點是我們一次將所有行加載到內存中( rows
是一個包含所有獲取行的 Python list
)。 如果獲取的行數非常大和/或如果您只需要一個一個地獨立迭代行(通常是這種情況),這可能是不可取的。
如果一次將所有獲取的行加載到內存中是不可接受的,那么我們可以這樣做:
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.