【问题标题】:Python sqlite3 "unable to open database file" on windowsWindows上的Python sqlite3“无法打开数据库文件”
【发布时间】:2009-10-07 04:50:37
【问题描述】:

我正在使用 python 3.1.1 开发 Windows vista 机器。我正在尝试将大量行插入 SQLite3 数据库。该文件存在,并且我的程序将 some 行正确插入到数据库中。但是,在插入过程的某个时刻,程序会因以下消息而终止: 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

我怎么可能插入一些行,然后得到这个错误?

【问题讨论】:

  • 我很困惑,不知道这是否是 3.1 的 sqlite、一般的 windows、特别是 vista 的错误,或者是什么——我无法重现它。您能否发布您找到的重现问题的最简单方法...?坦克!
  • Vista 和 Python2.6/Django 有类似的问题。一种模拟方法可能是使用 Windows 资源管理器转到 db 文件夹,然后强制刷新

标签: python sqlite windows-vista


【解决方案1】:

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

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

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

【讨论】:

  • 我对@9​​87654321@ 的阅读是使用隔离级别,我可以控制 BEGIN 语句。数据库连接构造为: conn = sqlite3.connect(db_file,isolation_level=None) 应该自动提交。我也尝试过使用默认级别,但会出现同样的问题。在运行 executemany 语句之前是否需要一些额外的代码来启动事务?
【解决方案2】:

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

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

只是我的 2 美分!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 2011-07-24
    • 2011-06-05
    • 1970-01-01
    • 2021-10-19
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多