【服务后端】MySQL数据库与Django Models不一致问题解决
1 背景
1.8 Django的APP目录下有makemigrations文件夹,这个文件夹中的文件误删除过,后面从其他电脑的工程目录中拷贝了过来。
进行了python manage.py makemigrations和python manage.py migrate操作。
由于前后的makemigrations的文件不一致,导致数据库中的字段与Django的Models字段不一致,访问时报错
1.1 数据库表如下
1.2 Django的Models中如下
class Class(JsonMode):
#idClass = models.AutoField(primary_key=True)
ClassNumber = models.CharField(max_length=3)
ClassName = models.CharField(max_length=20,default='')
GenerateYear = models.DateTimeField(default=None)
GrandType = ((u'幼稚园',u'幼稚园'),(u'学前班',u'学前班'),(u'小学',u'小学'),(u'初中',u'初中'),(u'高中',u'高中'))
Type = models.CharField(choices=GrandType,max_length=3)
idSchool = models.ForeignKey(School,related_name='fkClass2School')
CreatedUser = models.ForeignKey(User,related_name='fkClassCreatedUser2User')
Owner = models.ForeignKey(User,related_name='fkClassOwner2User')
_FILE_HeaderFigure = models.CharField(max_length=300,default='')
2.问题分析
2.1 0001_initial.py
查看makemigrations文件init.py文件的Class表,发现初始化时,ClassName字段已经存在,可能备份PC和当前PC的数据库构造时间不一样。
migrations.CreateModel(
name='Class',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('IsDelete', models.BooleanField(default=False)),
('CreateTime', models.DateTimeField(auto_now_add=True, null=True)),
('ModifyTime', models.DateTimeField(auto_now=True, null=True)),
('ClassNumber', models.CharField(max_length=3)),
('ClassName', models.CharField(default=b'', max_length=20)),
('GenerateYear', models.DateTimeField(default=None)),
('Type', models.CharField(max_length=3, choices=[('\u5e7c\u7a1a\u56ed', '\u5e7c\u7a1a\u56ed'), ('\u5b66\u524d\u73ed', '\u5b66\u524d\u73ed'), ('\u5c0f\u5b66', '\u5c0f\u5b66'), ('\u521d\u4e2d', '\u521d\u4e2d'), ('\u9ad8\u4e2d', '\u9ad8\u4e2d')])),
],
options={
'abstract': False,
},
2.2 0002_auto_20160409_1254.py
初始化文件之外的更新文件
其他文件 中也已经有AddFiled字段将 CreatedUser 等字段添加到表里面,所以差异化分析时了解MySQL数据库中这些字段已经存在
migrations.AddField(
model_name='class',
name='CreatedUser',
field=models.ForeignKey(related_name='fkClassCreatedUser2User', to='School.User'),
),
3 尝试解决
删除这些同步记录,保持makemigrations与mysql中字段一致,再重新同步一下
数据同步成功之后,访问正常