问题:为什么我不能打开数据库?
信息:我正在开发一个目的不重要但使用sqlite3数据库的项目。我制作了一个测试程序,它运行并传递给它创建数据库的位置:
/tmp/cer/could.db
单元测试程序可以使db没问题。然后,我实际上使用该程序,将相同的位置传递给它,并说它
OperationalError:无法打开数据库文件
我尝试过使用空数据库。与数据库单元测试留下,没有数据库。在所有三种情况下,我都会收到此错误。最令人沮丧的部分必须是单元测试可以做得很好,但实际的程序不能。
关于到底发生了什么的任何线索?
答案 0 :(得分:57)
主要诊断:SQLite因某种原因无法打开该文件。
检查明显的原因,并按照我建议的大致顺序进行检查:
/tmp
的磁盘是否已满? (你在Unix上,所以用df /tmp
来查找。)/tmp/cer
目录是否具有“奇数”权限? (SQLite需要能够在其中创建其他文件以处理提交日志之类的事情。)/tmp
实际上总是在正确的FS上,所以它可能不是那样 - 但它仍然不是推荐的。)如果您不在同一台计算机上,则生产系统很可能没有/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 的身份运行了它的调度程序。在运行任务实例时,我将impersonate的run_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
然后重试