Sqlite3, OperationalError: 无法打开数据库文件

103 投票
19 回答
296949 浏览
提问于 2025-04-16 09:38

问题:为什么我打不开数据库?


信息:我正在做一个项目,使用的是 sqlite3 数据库。我写了一个测试程序,运行时传入了数据库的路径:

/tmp/cer/could.db

这个单元测试程序可以顺利创建 db,没有任何问题。但是,当我实际使用这个程序并传入同样的路径时,却出现了下面的错误:

OperationalError: 无法打开数据库文件

我尝试了以下几种方法:

1) an empty database.
2) the database and the unit test left behind.
3) no database at all.

在这三种情况下,我都遇到了上述错误。最让人沮丧的是,unittest 可以正常工作,但实际程序却不行。

有没有人能告诉我到底发生了什么?

19 个回答

16

在Unix系统上,我在使用~这个快捷方式来表示用户目录时遇到了错误。把它改成/home/user就解决了这个问题。

46

这个方法对我有效:

conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")

注意:完整路径中有双斜杠

我在 Windows 7 企业版和 Windows XP 专业版上使用 python v2.7

希望这能帮助到某个人。

102

主要问题:SQLite因为某种原因无法打开那个文件。

检查一下明显的原因,以下是我建议的检查顺序:

  • 程序是在你测试的同一台机器上运行吗?
  • 它是以你(或者至少是你测试时用的同一个用户)身份运行的吗?
  • 包含/tmp的磁盘满了吗?(你在用Unix系统,可以用df /tmp来查看。)
  • /tmp/cer目录的权限是否有点“奇怪”?(SQLite需要在里面创建额外的文件来处理一些事情,比如提交日志。)
  • 单元测试代码还在使用那个数据库吗?(在现代的SQLite和合适的文件系统下,多个打开是可能的——不过/tmp几乎总是在合适的文件系统上,所以这可能不是问题——但还是不推荐这样做。)
  • 开发代码真的在尝试写入那个数据库吗,还是有什么“聪明”的东西让你误以为它在打开其他东西?(我以前在代码中就遇到过这种情况,不要以为这不会发生在你身上……)
  • 你在单元测试和生产代码中使用的是同一个版本的SQLite库吗?

如果你不在同一台机器上,生产系统可能根本没有/tmp/cer目录。首先解决这个问题。如果你在同一台机器上但以不同用户身份运行,可能会有权限或所有权的问题。磁盘空间也是一个严重的问题,但可能性较小。我觉得最后三个问题不太可能,但如果更明显的问题都解决了,还是值得检查一下。如果都不是这些问题,那你可能遇到了比较复杂的问题,需要提供更多信息(这甚至可能是SQLite的一个bug,但考虑到它的开发者,我觉得这种可能性不大)。

撰写回答