我完全不知道我在sqlite3中遇到的间歇性错误。问题是完全相同的脚本偶尔会运行完成,否则它会在看似随机的SELECT语句中失败。由于它不能正确重复,我不知道我做错了什么或是否有错误。我在mailing list看到了一个非常相似的问题,但Guido van Rossum刚刚在其他地方提到过它们,我无法找到后续行动。
简化代码:
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()
我可以运行一次,从print语句中我会得到:
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
然后再次运行相同的脚本 会产生第一个错误。它要么在两者之间打乒乓,要么创建一个持久锁(我假设它是一个完全损坏的数据库。没有其他进程使用这个脚本,我将它作为Canopy中的测试开发,只有这个脚本使用db
答案 0 :(得分:1)
您的提交和提取之间的提交不应该存在。
可以肯定的是,您可以尝试在删除提交后控制try catch会发生什么:
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
答案 1 :(得分:0)
尝试检查连接隔离级别:https://docs.python.org/2/library/sqlite3.html#sqlite3.Connection.isolation_level
'获取或设置当前隔离级别。没有自动提交模式或 “DEFERRED”,“IMMEDIATE”或“EXCLUSIVE”之一。请参阅控制部分 交易有更详细的解释。'
- &GT;试试“EXCLUSIVE”