本文记录了我项目app迁移到其它的全过程,包括踩过的坑
使用情景: 当你需要将a项目的某个app迁移到b项目中,并且你还要实现数据表(包括数据)的迁移
本文默认必要包依赖和settings配置
b项目已经都有了。
🚀步骤:
1. 项目迁移
将a项目的该app复制到b项目中,并将其注册到b项目的INSTALLED_APPS中,当然,如果有其它的中间件或者设置啥的,也记得迁移到settings中。
2. 重置迁移文件
删除b项目中该app目录下的migrations文件夹中所有迁移文件,除了__init__.py
3. 在目标项目中生成并应用迁移
python manage.py makemigrations your_app_name
python manage.py migrate your_app_name
这一步可能会报错:django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency accounts.0001_initial on database ‘default’.
原因及解决方案:"如果我们一开始使用的是django原生模型User,在后来的开发中,我们在其他app中想使用自己的User模型,在我们makemigrations时,就会出现以上错误"
解决方案:
- 在setttings文件中注释掉:
django.contrib.admin - 在urls文件中注释掉:
path('admin/', admin.site.urls) - 重新migrate
- 将刚才注释的代码加回去
- 重新migrate
4. 导出源项目的数据
进入到源项目中,并在根目录中运行以下命令将数据变成json格式导出
python manage.py dumpdata your_app_name > data.json
5. 将数据导入目标项目
- 将生成的data.json复制到b项目目录下。
- 在b项目的根目录中运行以下命令并加载数据
python manage.py loaddata data.json
这一步可能会报错:"UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte"
原因及解决方案: 你导出数据时的数据格式(比如是UTF-16LE)跟你想导入的数据库所需数据格式不一致,比如你导出的数据的编码是UTF-16LE,但是你想导入的数据库它要求数据的编码是utf-8,导致写入失败。
PS:具体的数据编码可以看编辑器(pycharm,vscode)右下角
解决方案
- 使用Notepad2编辑器直接修改data.json文件的编码为UTF8.
- 重新执行命令加载数据即可。