0%

Django-数据迁移问题

Django在迁移数据库数据时一些方法步骤,以及在导出安全删除数据时的处理方法

  1. 清空数据表
    python manage.py flush

  2. 使用Django框架的倒入导出
    python manage.py dumpdata [APP_NAME] > [EXPOER_FILE_NAME]
    python manage.py loaddata [EXPOER_FILE_NAME]
    不指定应用名称则会导出所有数据表,包括一些系统数据表
    所以在导出时尽量只指定有关业务应用的名称
    例如:
    有personnels和customers两个应用要导出数据时
    python manage.py dumpdata personnels customers > data.json

    导入数据
    python manage.py loaddata data.json

  3. 当使用安全删除策略时可能面临的导出问题
    若业务删除操作写的很标准,关联数据都可以逻辑删除的话,执行上述导出导入就可以实现数据的迁移
    但时可能由于业务复杂,表关联复杂,导致一些数据逻辑删除后,其关联表数据还在。这样在执行原来导出时,那些逻辑删除的数据会导不出来,在执行导入时就会导致某些PK找不到数据

    如下解决方法是修改框架对于数据查询的代码,将所有数据,包括逻辑删除的数据一并导出

    修改框架manager.py的get_queryset函数中的将safedelete_visibility修改为DELETE_VISIBLE

    1
    queryset._safedelete_visibility = DELETED_VISIBLE

    然后执行导出命令

    说明:
    在寻找解决方法的过程实际上是想到python manage.py dumpdata命令也是要查询数据的,万变不离其宗,他一定会去查数据表中的数据,也一定是通过sql语句查询的,未修改框架代码时,他默认是过滤掉了逻辑删除的数据,所以这里只要找到调用数据库查询的接口,把逻辑删除查询命令改掉就可以,经过查找就是这个了。