Windows上的Python sqlite3“无法打开数据库文件”

时间:2009-10-07 04:50:37

标签: python sqlite windows-vista

我正在使用python 3.1.1中的windows vista机器。我试图在SQLite3数据库中插入大量的行。该文件存在,我的程序正确地将一些行插入到数据库中。但是,在插入过程中的某个时刻,程序会因此消息而死:     sqlite3.OperationalError:无法打开数据库文件

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

以下是专门处理插入的代码:

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

我怎么可能插入一些行,但是会出现这个错误?

2 个答案:

答案 0 :(得分:1)

SQLite没有记录锁定;它使用一种简单的锁定机制,在写入期间短暂锁定整个数据库文件。听起来你正在遇到一个尚未清除的锁。

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

在最新版本的SQLite中,锁定机制已得到增强,因此可能不再需要完整的文件锁定。

答案 1 :(得分:0)

在某些记录正确插入后,Windows 7(python 2.6,django 1.1.1和sqllite)上的错误如下:sqlite3.OperationalError:无法打开数据库文件

我从Eclipse运行我的脚本不同时间,总是遇到错误。但是当我从命令行运行它(在设置PYTHONPATH和DJANGO_SETTINGS_MODULE之后)它就像魅力一样......

只是我的2美分!