django项目数据库迁移过程记录及注意事项

前段时间,在对一个ajango的仓库项目进行了旧数据库的迁移。由于数据库的model发生了较大的变化,因此,迁移过程很小心,逐表进行。
步骤:
1.用新的数据库model进行migrate,保证字段相同。
2.然后导出excel表,手工修改正确。
3.在一个无人操作数据库的时间段,导入表格。


第一步,备份要导入的数据库。
# mysqldump -hrm-2zei290y0jssy27y5po.mysql.rds.aliyuncs.com -u aircos -p cmm  > backup_aircos_cmm_20171226.sql
第二步,新建立一个db,导入旧数据,在旧数据库基础上,用新的model来做migrate迁移。
删除migrations下面的迁移文件。仅保留__init__.py。
删除django migrate过程中建立的全部的auth_xxx, django_xxx表。否则无法再次migrate。
# python manage.py makemigrations
# python manage.py migrate
但我发现user表中的:    favorite_warehouse = models.ManyToManyField('cmm.Warehouse',
                                                through='cmm.UserFavorite',
                                                verbose_name='用户收藏仓库')
字段始终无法建立起来。
新建一个表,用新的模型来做migrate,这样也无法建立起来,看来是这个字段本身有问题。
PS:如果缺少了中间的migrations目录下面的过程迁移文件,那数据库就无法用django的办法来维护了。
只有导出数据,删除旧数据库,建立新数据库,重新做migrate,再导入旧数据。
第三步,
不能批量导出和导入,只有一张表一张表的导出和导入。
先备份:# mysqldump -hrm-2zei290y0jssy27y5po.mysql.rds.aliyuncs.com -u aircos -p cmm  > backup_aircos_cmm_20171226.sql
第一张表:user_company_info。
第二张表:user表。user_company_info_id字段进行手工关联。
此次只需要导入0:仓主和1:分仓用户这两种role的user。其它user删除。注意id号段要跟新库一致,不要冲突.
导入完后后,修改sys_increment_sequence表的user号段,否则新注册用户的号段会重复.
第三张表:user_role。如果这个用户没有角色的话,查询用户信息就要出错,帐号无法正常使用。
user与role要手工关联后再导入。
position表,user_position表不导. user_third_login没有用户信息,不用导.
第四张表: warehouse表. 先对比了新旧两张表的结构,是一致的。这样导入数据就方便了许多。
owner_id要对应上新的user_id。根据新旧user_id对照表来一一替换。
apply_number要接续上新号段(an10替换为an00,用保留号段)。
id用保留号段,WH10替换为WH00
第五张表:warehouse_commodity_classification
WH10替换为WH00。导入时,将自增的主键一列留空,否则生成新记录时,要出错。
第6张表:warehouse_express。表格列数一致,但排列顺序不同,不能直接按数据导入。
第7张表:warehouse_fire_fighting_equipment
第8张表:warehouse_material
第9张表:warehouse_service,表格列数相同,但排序顺序不同,inert into时,加上表名和列名。
总结一下:首先,最重要的事情是各表的primary-key的处理。这就涉及到同步修改sys表(产生唯一主键或索引用的表)。
比如warehouse表中,id和apply_number是由程序来生成的,如果不同步修改sys表,导入数据后,多了很多记录,以后新生成记录时,根据sys表自动
生成的id和apply_number会跟导入的数据重复,导致冲突。其次,父表先导入,这样才能有主键,子表才好使用。比如warehouse表,
owner_id是必须要的外键,关联user表。因此,必须要先导入user表。

你可能感兴趣的:(#,前端开发)