簡體   English   中英

在Python SQLite executemany查詢中使用進度處理程序

[英]Using a progress handler in Python SQLite executemany query

我有一個帶有長時間運行的SQLite查詢的Python應用程序,我想在PyQT表單上顯示進度。

我的代碼的精簡版:

def run_long_query(self,)

    self.con = lite.connect(self.dbfname)
    self.con.set_progress_handler(self.progress_handler, 1)
    cur = self.con.cursor()
    vals = list(self.hash_iter(dirname, pattern))
    query = "INSERT OR REPLACE INTO hashval2fname (hashvalue, fname) VALUES(?, ?)"
    cur.executemany(query, vals)
    self.con.commit()
    self.con.close()

def progress_handler(self):
    print self.counter
    self.counter += 1
    self.pbar.setValue((self.pbar.value() + self.prog_step / 2))
    time.sleep(0.1)
    return 0  #  returning non-zero aborts

一切都很好,但我得到了相當多的進度更新。 例如,假設vals返回一個長度為10的列表。我將進度條的上限設置為10,我希望查詢運行10次,並且我的progress_handler函數被調用10次,在此期間它會更新我的進度條一個步驟。

取而代之的是,我看到的是對進度處理程序的調用次數(set_progress_handler調用中為1)比每次查詢執行多1。 例如,在我的val列表中包含一項的情況下,根據我的特定查詢,我看到在13-23之間有一定數量的對progress_handler的調用。 我通常不會在乎,但是我不知道如何有意義地使進度條跟蹤,而又不知道預期有多少次迭代。

根據文檔set_progress_handler的第二個參數是連續兩次調用回調之間的虛擬機指令數。

指令由查詢優化器生成; 詳細信息是高度可變的,不僅取決於數據庫結構,而且還取決於數據本身以及SQLite版本。 無法預測總共有多少條指令,甚至每行多少條指令。 (您可以使用EXPLAIN來顯示查詢的指令,但是該輸出對於預測指令的執行頻率不是很有幫助。)

您不能在表格中顯示百分比; 最好的辦法就是動畫的等候圈。

暫無
暫無

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

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