Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Sqlite3,操作错误:无法打开数据库文件_Python_Sqlite - Fatal编程技术网

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由于某种原因无法打开该文件

检查明显的原因,以及我建议检查的大致顺序:

  • 该程序是否与您正在测试的程序在同一台机器上运行
  • 它是否以您的身份运行(或者至少与您测试它的用户相同)
  • 包含
    /tmp
    的磁盘是否已满?(您使用的是Unix,因此请使用
    df/tmp
    查找。)
  • /tmp/cer
    目录是否具有“奇数”权限?(SQLite需要能够在其中创建其他文件,以便处理提交日志之类的事情。)
  • 单元测试代码仍在使用该数据库吗?(如果使用足够现代的SQLite,并且在正确的文件系统中,并发打开是可能的—尽管
    /tmp
    实际上总是在正确的FS类型上,所以可能不是这样—但仍然不推荐使用它。)
  • 是开发代码真的试图写入该数据库,还是某个“聪明”的东西吸引了您,并导致它尝试打开其他东西?(我在过去的代码中已经被这一点抓住了;不要认为这不会发生在你身上……)
  • 您在单元测试和生产代码中使用的是同一版本的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