You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将本地基于SQLite3的Django项目迁移至PostgreSQL Docker容器,并解决密码认证失败问题?

如何将本地基于SQLite3的Django项目迁移至PostgreSQL Docker容器,并解决密码认证失败问题?

看起来你已经搭好了PostgreSQL容器的基础环境,但卡在了Django与容器的认证环节上,我来帮你一步步排查解决,顺便补全迁移的完整流程:

一、先排查核心的认证失败原因

1. 确认容器内实际生效的pg_hba.conf配置

你贴的pg_hba.conf可能不是容器内正在使用的——官方Postgres镜像的默认配置和手动修改的可能有差异,而且配置是顺序匹配的(从上到下第一个匹配的规则生效)。先执行这条命令查看容器内的真实配置:

docker exec -it db_container cat /var/lib/postgresql/data/pg_hba.conf

重点看127.0.0.1/32对应的规则是不是trust,如果最后一行的host all all all scram-sha-256在本地规则之后,其实不会影响127.0.0.1的连接(优先匹配上面的trust规则),但如果配置顺序不对,就会触发密码认证。

2. 验证Django是否正确读取了.env变量

很多时候问题出在环境变量没被正确加载:

  • 先确认python-decouple的使用是否正确,如果你的.env文件不在项目根目录(比如settings.py在子文件夹里),需要手动指定路径:
    # 在settings.py开头修改config的初始化
    from decouple import Config, RepositoryEnv
    import os
    
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    config = Config(RepositoryEnv(os.path.join(BASE_DIR, '.env')))
    
  • 快速测试:运行uv run python manage.py shell,然后输入from django.conf import settings; print(settings.DATABASES['default']['PASSWORD']),看输出的是不是mypassword。如果不是,说明环境变量没读对,要么路径错了,要么.env文件格式有问题(比如变量名前后有空格)。
  • 极端测试:暂时把DATABASES里的密码硬编码成'mypassword',再跑migrate,如果能成功,就坐实是环境变量的问题。

3. 检查容器的端口与监听状态

  • 确认5432端口确实被容器占用:执行netstat -tulpn | grep 5432,看输出的进程是不是docker-proxy。如果是本地其他PostgreSQL进程占用了端口,先停掉它,再重启容器。
  • 确认容器内的PostgreSQL监听了所有地址:查看容器内的postgresql.conf:
    docker exec -it db_container cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses
    
    官方镜像默认是listen_addresses = '*',一般默认就没问题。

二、重置并重新配置容器(避免旧配置残留)

如果上面的排查没找到问题,直接重置容器,确保环境干净:

  1. 停止并删除旧容器:
    docker stop db_container && docker rm db_container
    
  2. 重新启动容器(复制这条命令,确保参数完全正确):
    docker run --name=db_container -d \
      -e POSTGRES_DB=mydatabase \
      -e POSTGRES_USER=myuser \
      -e POSTGRES_PASSWORD=mypassword \
      -p 5432:5432 \
      postgres:16.2
    
  3. 查看容器日志确认启动成功:
    docker logs db_container
    
    看到database system is ready to accept connections就说明容器正常运行了。

三、完整的SQLite到PostgreSQL迁移流程

当Django能成功连接容器后,就可以开始迁移数据了:

  1. 备份SQLite数据:
    为了避免导入时的权限和模型冲突,排除系统级的表:
    uv run python manage.py dumpdata --exclude auth.permission --exclude contenttypes > data.json
    
  2. 初始化PostgreSQL表结构:
    先创建空的表结构:
    uv run python manage.py migrate
    
  3. 导入备份数据:
    uv run python manage.py loaddata data.json
    
  4. 验证迁移结果:
    运行uv run python manage.py shell,随便查一个模型的数据,比如from myapp.models import MyModel; print(MyModel.objects.count()),确认数据导入成功。

四、额外的开发优化建议

  • 把容器的数据库数据持久化:加上-v $(pwd)/pg_data:/var/lib/postgresql/data参数,这样删除容器后数据不会丢失。
  • 用docker-compose管理容器:写一个docker-compose.yml,把Django和PostgreSQL的配置放在一起,启动更方便。

备注:内容来源于stack exchange,提问作者Jason Jarosz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 18:58:07