我完全難住我在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的軟件,我得到以下,顯示出最後的修改日期是重啓
事件的序列之前,甚至陌生人。錯誤現在交替如下。讀取數據庫第一次嘗試將以下內容打印到控制檯(打印跟蹤號碼,並輸入之前立即拋出錯誤的查詢)
%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中的一個測試進行開發,並且只有此腳本使用數據庫
顯示'num'的值和類型是在這種情況下。 –
@CL。它是打印在錯誤上方的那個:1614117623187(在SELECT查詢失敗之前打印)。我正確地認爲'參數0'指的是'num'而不是表中的內容(在'*'中)?現在我無法通過'while true'循環來獲取它,所以我認爲我在不知道的情況下對DB做了些什麼。意思是我無法檢查類型。我現在要爲我的新想法添加一個編輯,因爲它可能是自動提交失敗的問題。 – roganjosh
@CL。我已經在底部做了編輯,如果你能看一看,我會很感激。我即將開始自己製作一個測試用例,但我可能不符合標準? – roganjosh