目录
一、迁移命令
(一)前提
(二)生成迁移文件
(三)执行迁移
二、迁移问题
1. Error:No changes detected
2. Error:You are trying to add a non-nullable field 'XXX' to XXX without a default
解决方法(1)根据系统提供的选项,选择1
解决方法(2)根据系统提供的选项,选择2
① 增加 null = True 属性
② 增加 default = " " 属性
③ 删除有问题的model
④ 检查migrations文件
3. Error:django.db.utils.OperationalError: connection to server at "10.XXX.X.X", port 5432 failed: FATAL: password authentication failed for user "XXX"
4. Error:File "D:\XXX\venv368\lib\site-packages\django\db\migrations\operations\models.py", line 677, in state_forwards。model_state = state.models[app_label, self.name_lower]。KeyError: ('luoboapp', 'Book')
原因:
解决:
原因:
解决:
若是修改 / 新增 表结构,需先保证原来产生的迁移文件还保留着。
# 终端执行
python manage.py makemigrations BookApp
# 其中,BookApp是Application专案名,方便找到唯一的models.py文件
# Application具体是在settings.py文件中设置的。即:INSTALLED_APPS = ['BookApp']
# 终端执行
python manage.py migrate
原因:未指定执行的Application。
解决如下:
# 终端执行
# 1.这是遇到问题的终端命令
python manage.py makemigrations BookApp
python manage.py migrate
# 2.这是修改过后的终端命令
python ./manage.py makemigrations BookApp
python manage.py migrate
解决:
选择1,则代表系统自动设置默认属性,并让用户提供一个默认值。
即,操作:先输入1,回车,再输入任意值,回车。
若还有其他栏位也是出现这种情况,继续选择1,输入默认值。
选择2,则用户自定义设置。
即,操作:输入2,直接退出。
输入2退出指令后,再接着用以下其一操作来解决:
操作:给字段添加允许为空的属性,下指令,然后恢复字段,又下指令(该操作类似于系统选项1的解决办法)。
操作:给字段添加默认值的属性,下指令,然后恢复字段,又下指令。
操作:删除该model,下指令,然后恢复model,又下指令。
注意:若确定栏位没有问题,则确保之前的migrations文件没有问题。
解决:确保项目settings.py文件上设置的数据库 'USER' 和 'PASSWORD' 的值,与在 PostgreSQL数据库 中创建的用户名和密码匹配。
该model(如Book)被其他model(如Library)进行了外键关联,在其他model有一些栏位的变动并下迁移指令时,会寻找该model(如Book)。
若该model(如Book)此时已经重命名了(系统在最后才会更新该model名,如LuoboBook,而其他model关联的是旧该model名,如Book),则其他model就找不到该model(如LuoboBook),则会报错。
在执行迁移文件时,选择不要重新命名Book模型名。输入N。
如 Did you rename the luoboapp.Book model to LuoboBook? [y/N] N
再操作:把model还原成以前的model名(如Book)。再删掉新生成的migration文件,重新下指令。生成新的migration文件后,再将model名改成新名字(如LuoboBook)。再下指令,生成第二个新的migration文件。然后就能成功执行migrate。
该model有新增的字段,但是该model对应的数据库表还存在原来的数据记录。
清空该model对应的表的所有数据。
以上大部分问题是数据库同步有误、或migrations文件有冲突。
若实在找不到方法解决类似问题,则使用简单粗暴的方法。
即,把migrations文件夹的所有py文档删除(除了__init__.py),再把数据库删除重新创建。若担心操作有误,可以提前备份。