SELECT查询上的间歇性sqlite3绑定错误

时间:2016-03-02 16:09:11

标签: python sqlite

我完全不知道我在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,我得到以下内容,显示上次修改日期是在重新启动之前

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

然后再次运行相同的脚本 会产生第一个错误。它要么在两者之间打乒乓,要么创建一个持久锁(我假设它是一个完全损坏的数据库。没有其他进程使用这个脚本,我将它作为Canopy中的测试开发,只有这个脚本使用db

2 个答案:

答案 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”