2009-10-07 109 views
6

我在Windows Vista计算机上的python 3.1.1工作窗口。我正在尝试将大量的行插入到SQLite3数据库中。该文件存在,并且我的程序正确地将一些行插入到数据库中。但是,在插入过程的某个时刻,程序将随着此消息而死亡: sqlite3.OperationalError:无法打开数据库文件Python的sqlite3的“无法打开数据库文件”关于

但是,在它死亡之前,有几行正确添加到数据库中。

这里是一个专门处理的插入的代码:

idx = 0 
lst_to_ins = [] 
for addl_img in all_jpegs: 
    lst_to_ins.append((addl_img['col1'], addl_img['col2'])) 
    idx = idx + 1 
    if idx % 10 == 0: 
     logging.debug('adding rows [%s]', lst_to_ins) 
     conn.executemany(ins_sql, lst_to_ins) 
     conn.commit() 
     lst_to_ins = [] 
     logging.debug('added 10 rows [%d]', idx) 
if len(lst_to_ins) > 0: 
    conn.executemany(ins_sql, lst_to_ins) 
    conn.commit() 
    logging.debug('adding the last few rows to the db') 

此代码插入从10至400行的任何地方,然后用该错误消息

conn.executemany(ins_sql, lst_to_ins) 
sqlite3.OperationalError: unable to open database file 

模具如何是有可能,我可以插入一些行,但然后得到这个错误?

+0

我很不知所措,不能判断它是否与3.1的sqlite的一个bug,在一般情况下,在Vista中特别,或者说窗口 - 我不能复制。你能发布最简单的方法来重现你的问题......?坦克! – 2009-10-07 05:24:08

+0

我有Vista和Python2.6/Django类似的问题。一种模拟方法可能是使用Windows资源管理器转到db文件夹,然后强制刷新 – luc 2010-03-26 10:45:38

回答

1

SQLite没有记录锁定;它使用一个简单的锁定机制,在写入过程中简要锁定整个数据库文件。这听起来像你正在运行一个还没有清理的锁。

的SQLite笔者建议你之前做你插入创建一个事务,然后完成在结束交易。这会导致SQLite对插入请求进行排队,并在事务提交时使用单个文件锁执行它们。

SQLite中的最新版本,锁定机制进行了改进,所以它可能不是需要一个完整的文件锁定了。

+0

我的阅读http://docs.python.org/3.1/library/sqlite3.html#sqlite3-controlling-transactions是使用隔离级别,我可以控制BEGIN语句。数据库连接被构造为: 康恩= sqlite3.connect(db_file,ISOLATION_LEVEL =无) 应自动提交。我试过使用默认级别,但同样的问题发生。 在运行executemany语句之前是否需要一些额外的代码来启动事务? – 2009-10-07 16:20:08

0

同样的错误,在这里的Windows 7(Python 2.6中,Django的1.1.1和sqllite)后,一些记录插入正确:sqlite3.OperationalError:无法打开数据库文件

我跑我的剧本从Eclipse中不同的时间和总得到了那个错误。但正如我在命令行中运行它(后设置PYTHONPATH和DJANGO_SETTINGS_MODULE)它的工作作为一个魅力...

只是我的2美分!

相关问题