Django出现django.db.utils.OperationalError:无法打开数据库文件求助
Django OperationalError:无法打开数据库文件(已尝试权限修改和绝对路径)
问题描述
一直遇到django.db.utils.OperationalError,提示无法打开数据库文件。已经修改了文件权限,也设置了绝对路径,但错误依旧存在。
我的配置文件
settings.py
""" Django settings for bastionblog project. Generated by 'django-admin startproject' using Django 4.1.3. For more information on this file, see https://docs.djangoproject.com/en/4.1/topics/settings/ For the full list of settings and their values, see https://docs.djangoproject.com/en/4.1/ref/settings/ """ from pathlib import Path import os from main import constants # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent TEMPLATES_DIRS = os.path.join(BASE_DIR,'templates') # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY = constants.SECRET_KEY # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = ['77.68.125.183'] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'main' ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'bastionblog.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [TEMPLATES_DIRS], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'bastionblog.wsgi.application' # Database # https://docs.djangoproject.com/en/4.1/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': constants.ENGINE, 'NAME': constants.NAME, 'USER': constants.USER, 'PASSWORD': constants.DB_PASSWORD, 'HOST': constants.ENGINE, 'PORT': constants.PORT, } } # Password validation # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/4.1/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_URL = 'static/' STATICFILES_DIRS = ((os.path.join(BASE_DIR, 'static')), ) STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # Default primary key field type # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
constants.py
ENGINE = 'django.db.backends.sqlite3' NAME = '/var/lib/mysql/bastionblog' USER = 'admin' PORT = '3306'
解决方法
你的数据库配置存在核心矛盾,这是错误的根源:
1. 引擎与数据库类型完全不匹配
你配置的引擎是sqlite3(轻量级文件数据库),但NAME指向的是/var/lib/mysql/bastionblog——这是MySQL的存储路径,两者完全不兼容,必须二选一。
方案一:改用SQLite(适合开发/小型项目)
修改constants.py:
ENGINE = 'django.db.backends.sqlite3' # 把数据库文件放到项目目录下,权限更易管理 NAME = '/path/to/your/bastionblog/db.sqlite3' # 可替换为项目BASE_DIR下的绝对路径,比如BASE_DIR / 'db.sqlite3' # 删掉USER、PORT,SQLite不需要这些参数
同步修改settings.py的数据库配置,移除无用字段:
DATABASES = { 'default': { 'ENGINE': constants.ENGINE, 'NAME': constants.NAME, } }
最后确保NAME指向的目录,运行Django的用户(如本地用户或www-data)有读写权限:
chown -R your_user:your_group /path/to/your/bastionblog/ chmod -R 755 /path/to/your/bastionblog/
方案二:改用MySQL(适合生产/大型项目)
修改constants.py:
ENGINE = 'django.db.backends.mysql' NAME = 'bastionblog' # MySQL中已创建的数据库名,不是文件路径 USER = 'admin' PASSWORD = 'your_mysql_password' # 补充你的MySQL密码 HOST = 'localhost' # MySQL服务器地址,不是引擎名! PORT = '3306'
同步修正settings.py的数据库配置:
DATABASES = { 'default': { 'ENGINE': constants.ENGINE, 'NAME': constants.NAME, 'USER': constants.USER, 'PASSWORD': constants.DB_PASSWORD, 'HOST': constants.HOST, 'PORT': constants.PORT, } }
额外准备步骤:
- 在MySQL中创建名为
bastionblog的数据库 - 确保
admin用户拥有该数据库的读写权限 - 安装MySQL驱动:
pip install mysqlclient
2. 其他修复点
settings.py里把HOST设为constants.ENGINE是错误的,HOST应为数据库服务器地址(MySQL用),SQLite无需该参数- 检查
constants.py是否定义了DB_PASSWORD,当前代码缺失,需补充或直接移除PASSWORD字段(SQLite不需要)
内容的提问来源于stack exchange,提问作者Bastion
相关产品推荐
相关产品推荐

