部署Django应用到Heroku遇数据库错误及psycopg2导入问题求助
问题解决步骤
1. 修正PostgreSQL数据库配置错误
你当前的数据库配置完全不符合PostgreSQL的要求,不能把NAME设为SQLite的文件路径。Heroku会自动生成PostgreSQL数据库的环境变量,正确配置方式如下:
推荐使用dj-database-url包自动处理Heroku的数据库参数,先安装这个包:
pip install dj-database-url
然后在settings.py中修改DATABASES配置:
import dj_database_url DATABASES = { 'default': dj_database_url.config(default='sqlite:///' + str(BASE_DIR / 'db.sqlite3')) }
这个配置会优先读取Heroku的数据库环境变量,本地开发时自动 fallback 到SQLite,兼顾两种场景。
2. 解决psycopg2的DLL加载问题
Windows本地环境安装标准psycopg2容易出现DLL依赖错误,直接替换为psycopg2-binary即可:
pip install psycopg2-binary
把psycopg2-binary写入requirements.txt,Heroku上使用这个包不会有依赖兼容问题。
3. 同步数据库迁移到Heroku
之前出现no such table: auth_user,是因为本地的数据库迁移没有同步到Heroku的PostgreSQL实例中。完成上述配置后,执行以下步骤:
- 本地生成并执行迁移(确保本地表结构正确):
python manage.py makemigrations python manage.py migrate
- 提交代码到Git:
git add . git commit -m "Fix database config and add psycopg2-binary"
- 推送到Heroku:
git push heroku main
- 在Heroku上执行迁移,创建生产环境的数据库表:
heroku run python manage.py migrate
额外优化:分离本地与生产环境配置
为了避免本地开发和生产环境的配置冲突,可以在settings.py中加入环境判断:
import os import dj_database_url # 读取环境变量判断是否为开发模式 if os.environ.get('DEBUG') == 'True': DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } else: DATABASES = { 'default': dj_database_url.config() }
本地开发时可以用.env文件设置DEBUG=True(需安装python-dotenv包加载),Heroku后台设置DEBUG=False即可。
内容的提问来源于stack exchange,提问作者DanielFBest




