Sqlite3, OperationalError: unable to open database file
问:为什么我不能打开数据库?
信息:我正在做一个项目,它的目的并不重要,但使用的是一个sqlite3数据库。我做了一个测试程序,运行并传递给它创建数据库的位置:
单元测试程序可以使数据库无问题。然后我实际使用程序,将相同的位置传递给它,它说
OperationalError: unable to open database file
号
我试着用一个空的数据库来做。有了数据库,单元测试就落在后面了,根本就没有数据库。在这三种情况下,我都会得到这个错误。最令人沮丧的部分必须是单元测试可以做得很好,但实际的程序不能。
有关于地球上发生了什么的线索吗?
主要诊断:由于某种原因,SQLite无法打开该文件。
检查明显的原因,并按照我建议的大致顺序检查:
- 程序是否与您测试的机器在同一台机器上运行?
- 它是否以您的身份运行(或者至少与您测试它的用户相同)?
- 包含
/tmp 的磁盘是否已满?(您使用的是Unix,所以使用df /tmp 查找。) /tmp/cer 目录是否具有"奇数"权限?(sqlite需要能够在其中创建额外的文件,以便处理提交日志之类的事情。)- 单元测试代码是否仍在使用该数据库?(使用足够现代的sqlite并在正确的文件系统中同时打开是可能的——尽管
/tmp 实际上总是在正确的fs类型上,所以可能不是这样——但仍然不建议这样做。) - 开发代码是否真的试图写入该数据库,或者是什么"聪明"的东西将您捕获并导致它试图打开其他东西?(我以前在我的代码中就被这种情况所困扰;不要以为这不会发生在你身上…)
- 您是否在单元测试和生产代码中使用相同版本的sqlite库?
如果您不在同一台机器上,很可能生产系统没有
这对我很有用:
1 | conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db") |
号
注:全路径双斜杠
在Win 7 Enterprise和Win XP Pro上使用python v2.7
希望这能帮助别人。
在Unix上,当使用用户目录的
一个原因可能是运行代码的路径与数据库的指定路径不匹配。例如,如果在代码中有:
1 | conn = lite.connect('folder_A/my_database.db') |
。
在
解决这个问题的另一种方法可能是将连接命令包装在
从OS导入mkdir将sqlite3导入为lite
1 2 3 4 5 6 | try: conn = lite.connect('folder_A/my_database.db') except lite.OperationalError: mkdir('folder_A') finally: conn = lite.connect('folder_A/my_database.db') |
我在Windows7上也遇到了同样的问题。我的数据库名是
1 2 | self.connection = Database.connect(**kwargs) sqlite3.OperationalError: unable to open database file |
我用
确保在尝试运行syncdb时没有编辑settings.py文件,您将得到相同的错误!!!!
1 2 | self.connection = Database.connect(**kwargs) sqlite3.OperationalError: unable to open database file |
1)验证数据库路径,签入设置.py
1 2 3 4 5 6 7 8 9 | DATABASES = { 'default': { 'CONN_MAX_AGE': 0, 'ENGINE': 'django.db.backends.sqlite3', 'HOST': 'localhost', 'NAME': os.path.join(BASE_DIR, 'project.db'), 'PASSWORD': '', 'PORT': '', 'USER':'' |
有时不会有名称":os.path.join(base_dir,'project.db'),
2)确保对目标文件夹的权限和所有权
这对我很有用,
使用数据库文件的完全分类名称
使用-/home/ankit/desktop/ds/week-7-machinelearning/week-7-machinelearning/soccer/database.sqlite
相反-
这绝对是一个权限问题。如果有人在Linux上遇到此错误,请确保使用
1 2 3 4 5 6 | import sqlite3 connection = sqlite3.connect("d:\\pythonAPI\\data.db") cursor = connection.cursor() create_table ="CREATE TABLE users (id int, username text, password text)" cursor.execute(create_table) |
。
如果你没有弄清楚的话,就要更清楚地走完整的路
在我的例子中,解决方案是使用绝对路径来查找现有文件:
1 2 3 4 5 | import os.path filepath = os.path.abspath(filepath) # Leave this out if the file doesn't exist yet assert os.path.exists(filepath),"The file doesn't exist" conn = sqlite3.connect(filepath) |
。
我不知道这个修复方法为什么有效:路径只包含ASCII字符,没有空格。尽管如此,它还是起了作用。
参考:windows 7,python 3.6.5(64位)。
我无法在另一台计算机上重现这个问题(也是Windows7、Python3.6.4 64位),所以我不知道这个修复程序为什么能工作。
您只需创建文件夹(因为它不存在),程序将只创建数据库文件。这真的对我有用!