2016-03-02 57 views
2

我完全難住我在sqlite3中遇到的間歇性錯誤。問題是,完全相同的腳本偶爾會運行完成,否則它將在看似隨機的SELECT語句中失敗。由於它的重複性不好,我不知道是我做錯了什麼,或者是否有錯誤。我在mailing list上看到過一個非常類似的問題,但Guido van Rossum只是將它們引用到其他地方,我找不到後續內容。SELECT查詢中發生sqlite3間歇性綁定錯誤

的熬濃代碼:

import sqlite3 

conn = sqlite3.connect('c2c_orders.db') 
c = conn.cursor() 

tracking_nos = [u'1615146623203', u'1614117623187', u'1614174623176', 
       u'1614141623103', u'1614141623101', u'1613102623033', 
       u'1612192622864', u'1612104622842', u'1612109622787', 
       u'1612137622586', u'1612137622583', u'1611191622448', 
       u'1611166622426', u'1610118621895'] 

for num in tracking_nos: 
    print num 
    c.execute("SELECT * FROM mw_orders WHERE id=(?)", (num,)) 
    conn.commit() 
    db_result = c.fetchall() 

我可以運行此一次,從打印語句我會得到:

1615146623203 
1614117623187 
1614174623176 
1614141623103 
1614141623101 
1613102623033 
... 

精細。跟蹤號碼不存在於表格中,因此它將返回一個空列表。重置所有內容並重新運行:

1615146623203 
1614117623187 
--------------------------------------------------------------------------- 
InterfaceError       Traceback (most recent call last) 
C:\...path... in <module>() 
    113 
    114  orders = check_orders() 
--> 115  orderInfo = get_detailed_info(orders) 
    116 
    117  end = datetime.datetime.now() 

C:\C:\...path... in get_detailed_info(tracking_no) 
    63   data_list = get_data.json() 
    64 
---> 65   c.execute("SELECT * FROM mw_orders WHERE id=(?)", (num,)) 
    66   conn.commit() 
    67   db_result = c.fetchall() 

InterfaceError: Error binding parameter 0 - probably unsupported type. 

錯誤與主腳本相關,所以行不匹配。但我不明白。這可能發生在任何數量或根本沒有。據我可以告訴我正確地設置我的查詢。

這是在Enthought Canopy的Python 2.7上運行的sqlite3 2.6.0版本。有沒有人看過這個,知道如何解決這個問題?提前致謝。

編輯 在我的評論中提到的數據庫鎖持續在Windows重新啓動。使用這裏描述here的軟件,我得到以下,顯示出最後的修改日期是重啓

enter image description here

事件的序列之前,甚至陌生人。錯誤現在交替如下。讀取數據庫第一次嘗試將以下內容打印到控制檯(打印跟蹤號碼,並輸入之前立即拋出錯誤的查詢)

%run "C:\Users\Joshua\Canopy\PCscripts\full_vehicle_routing\dbSyncer2.py" 
1608123637974 
<type 'unicode'> 
1608188637849 
<type 'unicode'> 
1607105637842 
<type 'unicode'> 
1607133637841 
<type 'unicode'> 
--------------------------------------------------------------------------- 
InterfaceError       Traceback (most recent call last) 
C:\Users\Joshua\Canopy\PCscripts\full_vehicle_routing\dbSyncer2.py in <module>() 
    312  removeChecks = remove_all_checks() 
    313  orders = check_orders() 
--> 314  orderInfo = get_detailed_info(orders) 
    315  checkOldOrders = check_old_orders() 
    316 

C:\Users\Joshua\Canopy\PCscripts\full_vehicle_routing\dbSyncer2.py in get_detailed_info(tracking_no) 
    90   data_list = get_data.json() 
    91 
---> 92   c.execute("SELECT * FROM mw_orders WHERE id=(?)", (num,)) 
    93   conn.commit() 
    94   db_result = c.fetchall() 

InterfaceError: Error binding parameter 0 - probably unsupported type. 

嘗試再次運行,並得到:

C:\Users\Joshua\Canopy\PCscripts\full_vehicle_routing\dbSyncer2.py in remove_all_checks() 
    65 
    66 def remove_all_checks(): 
---> 67  c.execute("UPDATE mw_orders SET is_checked = '0'") 
    68  conn.commit() 
    69 

OperationalError: database is locked 

然後運行同樣的腳本再次給出第一個錯誤。它可以在兩者之間進行ping操作,或者創建一個持久鎖(我認爲這是一個完全損壞的數據庫。沒有其他進程使用此腳本,我正在將它作爲Canopy中的一個測試進行開發,並且只有此腳本使用數據庫

+0

顯示'num'的值和類型是在這種情況下。 –

+0

@CL。它是打印在錯誤上方的那個:1614117623187(在SELECT查詢失敗之前打印)。我正確地認爲'參數0'指的是'num'而不是表中的內容(在'*'中)?現在我無法通過'while true'循環來獲取它,所以我認爲我在不知道的情況下對DB做了些什麼。意思是我無法檢查類型。我現在要爲我的新想法添加一個編輯,因爲它可能是自動提交失敗的問題。 – roganjosh

+0

@CL。我已經在底部做了編輯,如果你能看一看,我會很感激。我即將開始自己製作一個測試用例,但我可能不符合標準? – roganjosh

回答

1

你的一個選擇和它取不應該存在之間提交

可以肯定的,你可以嘗試控制嘗試發生的情況刪除提交後捕獲:

for num in tracking_nos: 
    print num 
    try: 
     c.execute("SELECT * FROM mw_orders WHERE id=(?)", (num,)) 
     db_result = c.fetchall() 
    except Exception as e: 
     print "*** ERROR *** ", e, " reading >", num, "<", type(num) 
     # con.close() # optionally depending on your higher level logic 
     raise e 
+0

這將需要我花一段時間來測試這個抱歉,因爲現在我不能讓它再次失敗!我假設這個建議是爲了防止打印隊列不顯示最新的'num'和'type'作爲失敗的查詢?我想知道現在是否在我所查詢的服務器上存在某種類型的問題,因爲要正確調查此問題是非常困難的。 – roganjosh

+0

我很抱歉地說,經過數百個週期後,我無法重複這個錯誤,但我沒有改變任何基本的東西。這個問題持續4天沒有活動的原因是這也發生過。爲了安心,我想進一步深入探討,也許它會回來。感謝刪除提交的建議,我確實擺脫了這一點。從你的經驗來看,這可能是導致行爲不穩定的原因嗎? – roganjosh

+0

@roganjosh我不是一個真正的SQLite專家,我只用它來進行簡單的操作。那裏的提交非常糟糕,但我不能說是否足以造成不穩定。如果你刪除它,並從那時起工作,也許......無論如何,我已經重新寫了我的文章,使其看起來像一個答案 –