王锋 2026年06月24日 星期三 17:11 | 25次浏览 | 0条评论
注意database上的使用
Django + Heroku 连接 Heroku MySQL(ClearDB)settings.py 完整配置
Heroku 官方 MySQL 插件是 ClearDB MySQL,添加插件后会自动生成环境变量 CLEARDB_DATABASE_URL,核心思路:读取环境变量解析数据库连接参数,不硬编码账号密码。
一、前置准备
Heroku 安装 MySQL 插件
bash
运行
heroku addons:create cleardb:ignite
本地安装依赖
txt
# requirements.txt
django
pymysql
dj-database-url
gunicorn
二、settings.py 完整数据库配置
1. 顶部导入依赖
python
运行
import os
import dj_database_url
# 适配mysql驱动
import pymysql
pymysql.install_as_MySQLdb()
2. 数据库核心配置
python
运行
# 读取Heroku数据库环境变量
DATABASE_URL = os.environ.get('CLEARDB_DATABASE_URL')
if DATABASE_URL:
# Heroku线上MySQL配置
DATABASES = {
'default': dj_database_url.config(
default=DATABASE_URL,
conn_max_age=600, # 连接池超时
engine='django.db.backends.mysql'
)
}
else:
# 本地开发MySQL配置(本地调试用,线上不会执行)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'local_db',
'USER': 'root',
'PASSWORD': '本地密码',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
三、关键配套 settings 全局配置(Heroku 必须加)
1. 关闭调试、允许 Heroku 域名访问
python
运行
# 线上关闭DEBUG
DEBUG = os.environ.get('DEBUG', 'False') == 'True'
# 允许heroku分配的域名
ALLOWED_HOSTS = [os.environ.get('HEROKU_APP_NAME') + '.herokuapp.com']
# 兼容本地
if DEBUG:
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']
2. 静态文件配置(Heroku 必备)
python
运行
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# 生产静态文件收集
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'
3. 安全密钥(禁止硬编码)
python
运行
SECRET_KEY = os.environ.get('SECRET_KEY')
# 本地兜底
if not SECRET_KEY and DEBUG:
SECRET_KEY = 'dev-secret-key-123'
四、补充说明:dj_database_url 自动解析规则
ClearDB 的 CLEARDB_DATABASE_URL 格式示例:
plaintext
mysql://user:password@host:port/dbname?reconnect=true
dj_database_url.config() 会自动拆分:
USER / PASSWORD / HOST / PORT / NAME
并指定 mysql 引擎,无需手动拆分参数。
五、备选方案:手动拆分 ClearDB 参数(不推荐,仅做理解)
如果不想用dj-database-url,手动解析 URL:
python
运行
import os
from urllib.parse import urlparse
db_url = urlparse(os.environ.get("CLEARDB_DATABASE_URL"))
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": db_url.path[1:],
"USER": db_url.username,
"PASSWORD": db_url.password,
"HOST": db_url.hostname,
"PORT": db_url.port,
"OPTIONS": {
"charset": "utf8mb4"
}
}
}
六、常见坑与修复
pymysql 报错
必须执行 pymysql.install_as_MySQLdb() 放在文件最上方,否则 Django 不识别 mysql 驱动。
字符集乱码
增加数据库 OPTIONS,统一 utf8mb4:
python
运行
DATABASES['default']['OPTIONS'] = {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
}
migrate 迁移数据库
部署完成后执行 Heroku 迁移:
bash
运行
heroku run python manage.py migrate
环境变量缺失报错
登录 Heroku 后台 App → Settings → Config Vars,确认存在 CLEARDB_DATABASE_URL。
七、Procfile(同目录新建,不可少)
plaintext
web: gunicorn 你的项目名.wsgi --log-file -
Zeuux © 2026
京ICP备05028076号
暂时没有评论