Sqlite3, OperationalError: 无法打开数据库文件
问题:为什么我打不开数据库?
信息:我正在做一个项目,使用的是 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,但考虑到它的开发者,我觉得这种可能性不大)。