You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
注册

部署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

火山引擎 最新活动