Python SELECT查询上出现间歇性sqlite3绑定错误
我完全被sqlite3中的一个间歇性错误难住了。问题在于,完全相同的脚本偶尔会运行到完成,或者在看似随机的SELECT语句中失败。由于它不能正确地重复,我不知道是我做错了什么,还是有错误。我在这方面也看到过类似的问题,但Guido van Rossum只是把他们介绍到其他地方,我找不到后续的问题 简化代码:Python SELECT查询上出现间歇性sqlite3绑定错误,python,sqlite,Python,Sqlite,我完全被sqlite3中的一个间歇性错误难住了。问题在于,完全相同的脚本偶尔会运行到完成,或者在看似随机的SELECT语句中失败。由于它不能正确地重复,我不知道是我做错了什么,还是有错误。我在这方面也看到过类似的问题,但Guido van Rossum只是把他们介绍到其他地方,我找不到后续的问题 简化代码: import sqlite3 conn = sqlite3.connect('c2c_orders.db') c = conn.cursor() tracking_nos = [u'16
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.
然后再次运行相同的脚本会出现第一个错误。它要么在两者之间进行乒乓,要么创建一个持久锁(我假设这是一个完全损坏的db。没有其他进程使用此脚本,我将其开发为Canopy中的测试,只有此脚本使用db尝试检查连接隔离级别: '获取或设置当前隔离级别。对于自动提交模式或 “延迟”、“立即”或“独占”中的一种。参见控制部分 交易,以获得更详细的解释。”
-->请尝试“独占”您在select和其fetch之间的提交不应存在 可以肯定的是,在删除提交后,您可以尝试控制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
对于跟踪中的num\u编号:
打印数
尝试:
c、 执行(“从mw_订单中选择*,其中id=(?)”,(num,))
db_result=c.fetchall()
例外情况除外,如e:
打印“***错误***”,e,“读取>”,num,“显示在这种情况下num
的值和类型是什么。@CL.它是在错误上方打印的:1614117623187(在SELECT查询失败之前打印)。我正确地认为参数0
指的是num
,而不是表中的内容(在
中)?现在我无法在while true
循环中获取它,因此我认为我在不知道的情况下对数据库做了一些操作..这意味着我无法检查类型。我现在要为我的新想法添加一个编辑,因为这可能是自动提交失败的问题。@CL。我已经在底部进行了编辑,如果您能看一下,我将不胜感激。我马上就要添加一个编辑我自己开始构建一个测试用例,但我可能有点不对劲?@CL.确认即使失败,数字也会以unicode字符串的形式出现。id
也存储为字符串。从我问这个问题的时候开始,第一次运行脚本现在成功地将JSON字符串中的所有条目写入db.Runni重新启动脚本(该脚本应返回表中的条目)会随机失败。不仅如此,它现在会锁定数据库,即使重新启动也无法解锁它(Windows 7显示,这是我自己的脚本,即使在重新启动时也会将其锁定)任何进程都不可能在重新启动后继续运行。这听起来好像脚本在您不希望的情况下运行,可能会多次运行。感谢您的建议,但其行为方式完全相同:(我需要一段时间来测试这一点,很抱歉,现在我不能让它再次失败!我想建议是,如果打印队列没有刷新,在失败的查询上显示最新的num
和type
?我现在想知道我正在查询的服务器上是否存在某种类型问题,因为将此问题归结为正确地调查是如此困难。我很抱歉地说,经过数百次循环之后,现在我无法重复错误,但我没有改变任何基本的东西。这个问题持续了4天,没有任何活动的原因是,这以前也发生过。为了平和的心情,我想进一步深入,也许它会回来。谢谢你或者删除commit的建议,我确实去掉了。根据你的经验,这可能是导致行为不稳定的原因吗?@roganjosh我不是SQLite专家,我只在简单的操作中使用它。commit在那里非常糟糕,但我不能说它是否足以导致不稳定。如果你删除了它,它就起作用了ed从那时起,也许……无论如何,我已经重新编写了我的帖子,使它看起来像是answserOk感谢。直觉上,这并不是根本原因,但它仍然无法解释。我现在将接受并结束这篇文章,因为很明显,我没有足够的信息让我们任何人知道到底出了什么问题。如果我如果您的try/except/
离某个事件更近,则您的在该事件中保持不变:)
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
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