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

Nar*_*ser 49 python sqlite

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


信息:我正在开发一个目的不重要但使用sqlite3数据库的项目.我制作了一个测试程序,它运行并传递给它创建数据库的位置:

sqlite3

单元测试程序可以使db没问题.然后,我实际上使用该程序,将相同的位置传递给它,它说

OperationalError:无法打开数据库文件

我尝试过使用空数据库.与数据库单元测试留下,没有数据库.在所有三种情况下,我都会收到此错误.最令人沮丧的部分必须是单元测试可以做得很好,但实际的程序不能.

关于到底发生了什么的任何线索?

Don*_*ows 65

初步诊断:SQLite由于某种原因无法打开该文件.

检查明显的原因,并按照我建议的大致顺序检查:

  • 程序是否在您测试的同一台机器上运行?
  • 它是否像您一样运行(或者至少与您测试它的用户相同)?
  • 磁盘是否包含/tmp完整?(你在Unix上,所以df /tmp用来查找.)
  • /tmp/cer目录是否具有"奇数"权限?(SQLite需要能够在其中创建其他文件,以便处理提交日志之类的事情.)
  • 单元测试代码是否仍在使用该数据库?(并发打开可以用现代足够SQLite和当在正确的文件系统-尽管/tmp几乎总是在正确的排序FS的所以它可能不是-但它仍然不推荐)
  • 开发代码是否真的试图写入该数据库,或者是"聪明"的东西让你抓到并试图打开别的东西?(我以前在我的代码中被这个问题搞定了;不要以为它不会发生在你身上......)
  • 您是否在单元测试和生产代码中使用相同版本的SQLite库?

如果您不在同一台机器上,那么生产系统很可能没有/tmp/cer目录.显然要先解决这个问题.同样,如果您在同一台计算机上但以不同用户身份运行,则可能存在权限/所有权问题.磁盘空间是另一个严重的问题,但不太可能.我不认为这是最后三个,但是如果对更明显的部署问题进行排序,则值得检查.如果不是上述情况,你就会遇到一个异国情调的问题,并且必须报告更多的信息(它甚至可能是SQLite中的一个错误,但是知道它的开发者,我认为这是不太可能的).

  • 发现了我的问题.字符串不完全相同.由于我的配置文件,有一点点差异.配置文件在我的路径中留下了一个换行符,所以我试图打开:'/ tmp/tcer \\ncloud.db'我遇到了问题.但这是一个非常好的答案.非常感谢你! (5认同)
  • 谢谢!我遇到了这个问题,即使该文件具有该用户的写权限,它确实缺少Web服务器用户对该目录的写权限. (4认同)
  • 我有同样的问题.虽然数据库具有777权限,但它所在的目录是755,将其更改为777也可以解决问题.关于"奇数权限"的提示对我有帮助. (2认同)

小智 26

这对我有用:

conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")
Run Code Online (Sandbox Code Playgroud)

注意:完整路径中的双斜线

在Win 7企业和Win Xp Pro上使用python v2.7

希望这有助于某人.


Ric*_*evi 9

就我而言,我尝试在文件夹中创建 sqlite 数据库/tmp,并且从所有斜杠中我错过了一个斜杠

而不是sqlite:///tmp/mydb.sqlite-> sqlite:////tmp/mydb.sqlite...


Kas*_*mvd 8

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

conn = lite.connect('folder_A/my_database.db')
Run Code Online (Sandbox Code Playgroud)

并且您在folder_A没有folder_A它的地方或其他地方运行代码会引发此类错误。原因是 SQLite 将创建数据库文件,如果它不存在而不是文件夹。

解决此问题的另一种方法可能是将您的连接命令包装在一个try-except表达式中,如果它引发sqlite3.OperationalError.

from os import mkdir import sqlite3 as 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')
Run Code Online (Sandbox Code Playgroud)


Jac*_*uot 7

在unix上,我在使用~用户目录的快捷方式时遇到了这个错误.更改它以/home/user解决错误.