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

时间:2011-01-09 00:23:32

标签: python sqlite

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


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

/tmp/cer/could.db

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

  

OperationalError:无法打开数据库文件

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

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

19 个答案:

答案 0 :(得分:57)

主要诊断:SQLite因某种原因无法打开该文件。

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

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

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

答案 1 :(得分:25)

这对我有用:

conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")

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

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

希望这有助于某人。

答案 2 :(得分:6)

在unix上,使用用户目录的~快捷方式时出现错误。 将其更改为/home/user即可解决错误。

答案 3 :(得分:2)

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

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

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

解决此问题的另一种方法可能是将连接命令包装在try-except表达式中,并在引发sqlite3.OperationalError时创建目录。

从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')

答案 4 :(得分:1)

确保在尝试运行syncdb时没有编辑settings.py文件,您将收到相同的错误!!!

self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file

答案 5 :(得分:1)

在我的情况下,我尝试在/tmp文件夹中创建sqlite db,从所有斜杠中我错过了一个斜杠

代替sqlite:///tmp/mydb.sqlite-> sqlite:////tmp/mydb.sqlite ...

答案 6 :(得分:1)

我在Windows 7上遇到了同样的问题。我的数据库名称是test,我收到错误:

self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file

我将test替换为test.db并且一切顺利。

答案 7 :(得分:0)

您唯一需要做的就是创建文件夹(因为它已经不存在),程序只会创建数据库文件。 这真的对我有用!

答案 8 :(得分:0)

就我而言,解决方案是使用绝对路径来查找现有文件:

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位)。

我无法在另一台机器(也是Windows 7,Python 3.6.4 64位)上重现该问题,所以我不知道为什么这个修复工作正常。

答案 9 :(得分:0)

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)


如果您不清楚,则可以获得更清晰的完整路径

答案 10 :(得分:0)

这绝对是一个权限问题。如果有人在Linux上遇到此错误,请确保您正在使用sudo运行命令,因为该文件很可能是root拥有的。希望有帮助!

答案 11 :(得分:0)

使用数据库文件的全分类名称

使用-/home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite

代替-

答案 12 :(得分:0)

1)验证您的数据库路径,  检查您的settings.py

DATABASES = {
    'default': {
        'CONN_MAX_AGE': 0,
        'ENGINE': 'django.db.backends.sqlite3',
        'HOST': 'localhost',
        'NAME': os.path.join(BASE_DIR, 'project.db'),
        'PASSWORD': '',
        'PORT': '',
        'USER':''

有时候不会有NAME':os.path.join(BASE_DIR,'project.db'),

2)确保对目标文件夹的权限和所有权

对我有用

答案 13 :(得分:0)

如果这种情况是在正确访问数据库后随机发生的(并且未更改任何设置),则可能是由于损坏的数据库造成的。

试图同时从两个进程写入我的数据库后,我收到此错误,并且它必须损坏了db.sqlite3文件。

我的解决方案是在损坏发生之前恢复到先前的提交。

答案 14 :(得分:0)

我的理由很愚蠢。 我将manage.py放到终端上,因此它正在使用完整路径运行。 而且我已经更改了项目文件夹的名称。 因此,现在程序无法找到包含先前数据的文件,从而导致错误。

在这种情况下,请确保重新启动软件。

答案 15 :(得分:0)

在Windows上遇到错误,添加assert os.path.exists,仔细检查路径,以管理员身份运行脚本,无济于事。

如果将文件夹添加到Windows Defender的Ransomware Protection中,结果表明,除非将这些程序添加到“受控文件夹访问”白名单中,否则您将无法再使用其他程序在其中进行写操作。

解决方案-检查您的文件夹是否已添加到Windows Defender的Ransomware Protection中,然后将其删除以加快修复速度。

答案 16 :(得分:0)

针对与此问题相关的气流问题的任何人。

就我而言,我已经在/root/airflow中初始化了气流,并以 root 的身份运行了它的调度程序。在运行任务实例时,我将impersonaterun_as_user参数用于 web 用户。但是,气流始终无法触发我的DAG,并在日志中出现以下错误:

sqlite3.OperationalError: unable to open database file
...
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file

我还发现,一旦手动触发DAG,就会在/home/web下自动创建一个新的气流资源目录。我尚不清楚这种行为,但是通过从/root删除所有气流资源,在/home/web下重新初始化气流数据库并在下面的 web 运行调度程序来使其工作:

[root@host ~]# rm -rf airflow
[web@host ~]$ airflow initdb
[web@host ~]$ airflow scheduler -D

如果您想尝试这种方法,在执行任何操作之前,我可能需要备份您的数据。

答案 17 :(得分:0)

尝试在完全有效的数据库上创建索引时遇到此问题。事实证明,如果sqlite temp_store_directory变量/目录不可写,则会引发此错误(除了此处描述的其他原因)。

解决方案:将temp_store_directory更改为c.execute(f'PRAGMA temp_store_directory = "{writable_directory}"')。请注意,此实用程序is being deprecated尚不明确,将替代什么。

答案 18 :(得分:0)

也有同样的问题,但是最重要的回答对我来说太长了,所以我建议打开另一个外壳窗口类型 cd #enter 然后重试