Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SELECT查询上出现间歇性sqlite3绑定错误_Python_Sqlite - Fatal编程技术网

Python SELECT查询上出现间歇性sqlite3绑定错误

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

我完全被sqlite3中的一个间歇性错误难住了。问题在于,完全相同的脚本偶尔会运行到完成,或者在看似随机的SELECT语句中失败。由于它不能正确地重复,我不知道是我做错了什么,还是有错误。我在这方面也看到过类似的问题,但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() 
我可以运行此命令一次,并从打印语句中获得:

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