Python Sqlite3,操作错误:无法打开数据库文件
问题:为什么我不能打开数据库Python Sqlite3,操作错误:无法打开数据库文件,python,sqlite,Python,Sqlite,问题:为什么我不能打开数据库 信息:我正在使用sqlite3数据库进行一个项目。我编写了一个测试程序,运行并将其传递到数据库: /tmp/cer/can.db 单元测试程序可以使db无任何问题。但是,当我实际使用程序将相同的位置传递给它时,我得到了以下错误: 操作错误:无法打开数据库文件 我试着用: 1) an empty database. 2) the database and the unit test left behind. 3) no database at all. 在三个案例
信息:我正在使用
sqlite3
数据库进行一个项目。我编写了一个测试程序,运行并将其传递到数据库:
/tmp/cer/can.db
单元测试程序可以使db
无任何问题。但是,当我实际使用程序将相同的位置传递给它时,我得到了以下错误:
操作错误:无法打开数据库文件
我试着用:
1) an empty database.
2) the database and the unit test left behind.
3) no database at all.
在三个案例中,我得到了上述错误。最令人沮丧的是,unittest
可以做得很好,但实际的程序做不到
关于到底发生了什么有什么线索吗?主要诊断:SQLite由于某种原因无法打开该文件 检查明显的原因,以及我建议检查的大致顺序:
- 该程序是否与您正在测试的程序在同一台机器上运行
- 它是否以您的身份运行(或者至少与您测试它的用户相同)
- 包含
的磁盘是否已满?(您使用的是Unix,因此请使用/tmp
查找。)df/tmp
目录是否具有“奇数”权限?(SQLite需要能够在其中创建其他文件,以便处理提交日志之类的事情。)/tmp/cer
- 单元测试代码仍在使用该数据库吗?(如果使用足够现代的SQLite,并且在正确的文件系统中,并发打开是可能的—尽管
实际上总是在正确的FS类型上,所以可能不是这样—但仍然不推荐使用它。)/tmp
- 是开发代码真的试图写入该数据库,还是某个“聪明”的东西吸引了您,并导致它尝试打开其他东西?(我在过去的代码中已经被这一点抓住了;不要认为这不会发生在你身上……)
- 您在单元测试和生产代码中使用的是同一版本的SQLite库吗
如果您不在同一台机器上,生产系统很可能没有
/tmp/cer
目录。显然要先解决这个问题。类似地,如果您在同一台计算机上,但作为不同的用户运行,则可能存在权限/所有权问题。磁盘空间是另一个严重的问题,但可能性较小。我不认为这是最后三个问题,但值得检查一下,更明显的部署问题是否得到了解决。如果不是上述问题,您遇到了一个奇怪的问题,将不得不报告更多的信息(这甚至可能是SQLite中的一个bug,但了解它的开发人员,我相信这是不可能的)。确保您在尝试运行syncdb时没有编辑settings.py文件,您将得到相同的错误
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
这对我很有用:
conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")
注意:在完整路径中使用双斜杠
在Win 7 enterprise和Win Xp Pro上使用python v2.7
希望这对某人有所帮助。我在Windows7上也遇到了同样的问题。我的数据库名是
test
,我得到了错误:
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
我用
test.db
替换了test
,一切都很顺利。一个原因可能是在与数据库指定路径不匹配的路径中运行代码。例如,如果您的代码中有:
conn = lite.connect('folder_A/my_database.db')
如果您在文件夹A
中运行代码,或者在其他没有文件夹A
的地方运行代码,则会引发此类错误。原因是,如果数据库文件不存在,SQLite将创建数据库文件,而不是文件夹
解决此问题的另一种方法可能是将连接命令包装在try except
表达式中,并在它引发sqlite3.OperationalError
时创建目录
从操作系统导入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
解决了此错误。您只需创建文件夹(因为它还不存在),程序将只创建数据库文件。
这真的对我有用 在我的例子中,解决方案是使用绝对路径来查找现有文件:
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字符,没有空格。尽管如此,它还是起了作用
供参考:Windows7、Python 3.6.5(64位)
我无法在另一台机器上重现这个问题(同样是Windows7,Python3.6.4 64位),所以我不知道为什么这个修复程序可以工作
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)
如果您没有获得清晰的完整路径,那么这肯定是一个权限问题。如果有人在linux上遇到此错误,请确保使用
sudo
运行该命令,因为该文件很可能由root用户拥有。希望有帮助 使用数据库文件的完全分类名称
使用-/home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite
相反-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':''
有时不会有名称“:os.path.join(BASE_DIR,'project.db')
2) 确保目标文件夹的权限和所有权
这对我来说很有效,如果这是在正确访问数据库后随机发生的(并且没有更改任何设置),则可能是数据库损坏的结果 我在试图同时从两个进程写入数据库时出现了这个错误,它一定损坏了我的db.sqlite3文件
我的解决方案是恢复到腐败发生前的一次犯罪。我的理由很愚蠢。 我已将manage.py放到终端上,因此它正在使用完整路径运行。 我已经更改了项目文件夹的名称。 因此,现在程序无法找到包含以前数据的文件,因此出现了错误 请确保重新启动
sqlite3.OperationalError: unable to open database file
...
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
[root@host ~]# rm -rf airflow
[web@host ~]$ airflow initdb
[web@host ~]$ airflow scheduler -D