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

Sqlite3, OperationalError: unable to open database file

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

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

/tmp/cer/could.db

单元测试程序可以使数据库无问题。然后我实际使用程序,将相同的位置传递给它,它说

OperationalError: unable to open database file

我试着用一个空的数据库来做。有了数据库,单元测试就落在后面了,根本就没有数据库。在这三种情况下,我都会得到这个错误。最令人沮丧的部分必须是单元测试可以做得很好,但实际的程序不能。

有关于地球上发生了什么的线索吗?


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

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

  • 程序是否与您测试的机器在同一台机器上运行?
  • 它是否以您的身份运行(或者至少与您测试它的用户相同)?
  • 包含/tmp的磁盘是否已满?(您使用的是Unix,所以使用df /tmp查找。)
  • /tmp/cer目录是否具有"奇数"权限?(sqlite需要能够在其中创建额外的文件,以便处理提交日志之类的事情。)
  • 单元测试代码是否仍在使用该数据库?(使用足够现代的sqlite并在正确的文件系统中同时打开是可能的——尽管/tmp实际上总是在正确的fs类型上,所以可能不是这样——但仍然不建议这样做。)
  • 开发代码是否真的试图写入该数据库,或者是什么"聪明"的东西将您捕获并导致它试图打开其他东西?(我以前在我的代码中就被这种情况所困扰;不要以为这不会发生在你身上…)
  • 您是否在单元测试和生产代码中使用相同版本的sqlite库?

如果您不在同一台机器上,很可能生产系统没有/tmp/cer目录。很明显要先解决这个问题。同样,如果您在同一台计算机上,但以不同的用户身份运行,则可能存在权限/所有权问题。磁盘空间是另一个严重的问题,但可能性较小。我不认为这是最后三个问题,但它们值得检查是否解决了更明显的部署问题。如果不是以上的问题,您会遇到一个非常奇怪的问题,并且需要报告更多的信息(它甚至可能是sqlite中的一个bug,但是了解它的开发人员,我相信这是不太可能的)。


这对我很有用:

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

注:全路径双斜杠

在Win 7 Enterprise和Win XP Pro上使用python v2.7

希望这能帮助别人。


在Unix上,当使用用户目录的~快捷方式时,我得到了这个错误。改为/home/user解决了这个错误。


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

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

folder_A或其他没有folder_A的地方运行代码,就会产生这样的错误。原因是,如果数据库文件不存在,则SQLite将创建该文件,而不是文件夹。

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

从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上也遇到了同样的问题。我的数据库名是test,我得到了错误:

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

我用test.db替换了test,一切都很顺利。


确保在尝试运行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上遇到此错误,请确保使用sudo运行该命令,因为该文件很可能是由root拥有的。希望有帮助!


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位),所以我不知道这个修复程序为什么能工作。


您只需创建文件夹(因为它不存在),程序将只创建数据库文件。这真的对我有用!