您的位置:首页 > 数据库

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

2018-01-28 11:25 417 查看
前段时间,在对一个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表。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python django