Sqlite3,OperationalError:无法打开数据库文件
问题:为什么我不能打开数据库?
信息:我正在做一个项目,其目的不重要,但使用sqlite3数据库。 我做了一个testing程序,运行并传递给它一个数据库的位置:
/tmp/cer/could.db
和unit testing程序可以使数据库没有问题。 然后我去实际使用该程序,传递相同的位置,它说
OperationalError:无法打开数据库文件
我试着用一个空的数据库来做这件事。 数据库的unit testing留下了,根本没有数据库。 在所有三种情况下,我得到这个错误。 最令人沮丧的部分是unit testing可以做得很好,但实际的程序不能。
任何线索到底是怎么回事?
主要诊断:由于某种原因,SQLite无法打开该文件。
检查明显的原因,以及我推荐检查的大致顺序:
- 程序是否在您testing的同一台机器上运行?
- 它是否像你一样运行(或者至less是你正在testing的同一个用户)?
- 包含
/tmp
的磁盘是否已满? (你在Unix上,所以使用df /tmp
来查找。) -
/tmp/cer
目录是否具有“奇怪”的权限? (SQLite需要能够在其中创build额外的文件,以处理提交日志等事情)。 - unit testing代码仍在使用该数据库吗? (并发打开可能是一个足够现代的SQLite,当在正确的文件系统 – 虽然
/tmp
实际上总是在正确的types的FS,所以它可能不是 – 但它仍然不推荐)。 - 开发代码是真的试图写入数据库,还是“聪明”的东西赶上你,并试图打开别的东西? (过去,我在代码中被我发现了,不要以为它不会发生在你身上)
- 你是否在unit testing和生产代码中使用相同版本的SQLite库?
如果你不在同一台机器上,生产系统很可能没有/tmp/cer
目录。 明显的解决这个问题。 同样,如果您在同一台计算机上,但作为不同的用户运行,则可能会遇到权限/所有权问题。 磁盘空间是另一个严重的问题,但不太可能。 我不认为这是最后三个,但是他们值得检查更明显的部署问题是否被sorting。 如果不是上述情况,那么你遇到了一个奇怪的问题,将不得不报告更多的信息(它甚至可能是SQLite中的一个错误,但知道它的开发者,我相信这是不太可能的)。
这对我工作:
conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")
注意:在完整path中双斜杠
在Win 7企业版和Win Xp Pro上使用python v2.7
希望这有助于某人。
确保你没有编辑settings.py文件,而试图运行syncdb,你会得到同样的错误!
self.connection = Database.connect(**kwargs) sqlite3.OperationalError: unable to open database file
我在Windows 7面临同样的问题。我的数据库名称是test
,我得到的错误:
self.connection = Database.connect(**kwargs) sqlite3.OperationalError: unable to open database file
我用test.db
replace了test
,并且一切顺利。
一个原因可能是在与您指定的数据库path不匹配的path中运行代码。 例如,如果在你的代码中你有:
conn = lite.connect('folder_A/my_database.db')
而且你在folder_A
或其他没有folder_A
地方运行代码会引发这样的错误。 原因是SQLite会创build数据库文件,如果不存在的话不是该文件夹。
解决这个问题的另外一种方法是将连接命令封装在try-except
expression式中,如果引发sqlite3.OperationalError
,则创build该目录。
从os导入mkdir导入sqlite3为lite
try: conn = lite.connect('folder_A/my_database.db') except lite.OperationalError: mkdir('folder_A') finally: conn = lite.connect('folder_A/my_database.db')
在unix上,当使用用户目录的~
快捷方式时,出现了这个错误。 将其更改为/home/user
解决了错误。