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.dbreplace了test ,并且一切顺利。

一个原因可能是在与您指定的数据库path不匹配的path中运行代码。 例如,如果在你的代码中你有:

 conn = lite.connect('folder_A/my_database.db') 

而且你在folder_A或其他没有folder_A地方运行代码会引发这样的错误。 原因是SQLite会创build数据库文件,如果不存在的话不是该文件夹。

解决这个问题的另外一种方法是将连接命令封装在try-exceptexpression式中,如果引发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解决了错误。