makemigrations混乱导致migrate的解决办法 migrate 初始化 django

这能正常工作需要2个条件:
生成表之后没有变更过模型。为了迁移能工作,需要先做初始化迁移工作,然后再变更模型,因为django和迁移脚本做变更对比,而不是数据库。
没有手动修改过数据库 - django不能检测到你的数据库和模型的不匹配,当使用迁移修改这些表时只能得到error。


假设数据表都已经存在,不想删除数据库重新来
假设django的appname为game,数据库为gamelz
##########################################
'game':{#公共管理资源
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'gamelz', # Or path to database file if using sqlite3.
'USER': 'root', # Not used with sqlite3.
'PASSWORD': '123456', # Not used with sqlite3.
'HOST': 'localhost', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '3320', # Set to empty string for default. Not used with sqlite3.
'AUTOCOMMIT':True, # 这里必须是True,admin才能进去
# 注意这里是持久化连接的寿命,秒为单位,0表示连接后就断开, None表示无限持久连接,注意0和None的区别;
# 在每一个请求开始前,django关闭已经到期的数据库连接,即超过CONN_MAX_AGE的连接,所以django不是即时把到期的数据库持久化连接关闭;
'CONN_MAX_AGE':0,
'OPTIONS':{"init_command": "SET storage_engine=INNODB", # INNODB MYISAM,前者支持事务和行锁
"use_unicode": True , 'charset': 'utf8'}
}
#############################################

 

1. 保证game的model字段和gamelz的一样,这个要人工去查;

2. 清空数据库表django_migrations

3. 删除game/migrations

4. 初始化makemigrations
python manage.py makemigrations game[记住这里是app名字,如果为空,是不会创建所有的,所以必须一个一个app生成,这里可以写多个名字,空格隔开]

5. 不创建数据库的同步方法,【重要:如果报字段错误,则到相应的表加相应的字段即可,这里如果不加--database的话,默认是default数据库】
python manage.py migrate --fake-initial --database=game[这里的名字和setting.py的dbconfig的key一样,这里可以写多个名字,但要用多个--database]
如果这句报错,说表已经存在,那么运行
python manage.py migrate --fake --database=game[这里的名字和setting.py的dbconfig的key一样,这里可以写多个名字,但要用多个--database]

注意: --fake-inital和--fake的区别
--fake-inital 是检测是否有不存在的表,如果有则创建
--fake 是不检测任何表的存在

建议不要把migrations文件夹纳入版本库控制


分享到: 微信 更多