如何将本地基于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_addresseslisten_addresses = '*',一般默认就没问题。
二、重置并重新配置容器(避免旧配置残留)
如果上面的排查没找到问题,直接重置容器,确保环境干净:
- 停止并删除旧容器:
docker stop db_container && docker rm db_container - 重新启动容器(复制这条命令,确保参数完全正确):
docker run --name=db_container -d \ -e POSTGRES_DB=mydatabase \ -e POSTGRES_USER=myuser \ -e POSTGRES_PASSWORD=mypassword \ -p 5432:5432 \ postgres:16.2 - 查看容器日志确认启动成功:
看到docker logs db_containerdatabase system is ready to accept connections就说明容器正常运行了。
三、完整的SQLite到PostgreSQL迁移流程
当Django能成功连接容器后,就可以开始迁移数据了:
- 备份SQLite数据:
为了避免导入时的权限和模型冲突,排除系统级的表:uv run python manage.py dumpdata --exclude auth.permission --exclude contenttypes > data.json - 初始化PostgreSQL表结构:
先创建空的表结构:uv run python manage.py migrate - 导入备份数据:
uv run python manage.py loaddata data.json - 验证迁移结果:
运行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
相关产品推荐
相关产品推荐

