Sink

沉舟侧畔千帆过

  • 主页
  • 归档
  • 书籍
  • 书签
  • 技能树
  • 工具箱
  • LeetCode
  • 关于我
所有文章 友情链接 +1s

  • 主页
  • 归档
  • 书籍
  • 书签
  • 技能树
  • 工具箱
  • LeetCode
  • 关于我

Django 迁移 Model 到另一个 App

Published on 2019 / 04 / 11

随着项目进度推进,业务的流程更加完善,我的理解也更加深入。逐渐发现早期一些数据库表和APP的关系,不是那么的合理和有序。相关联的一些业务逻辑的表,不同业务层面的表,应该合理的、有序的、科学的分属于不同的APP。为了实现这份合理,就需要对现有的表进行数据迁移。

Django的表关系,不能直接通过数据库一行命令修改表的名称来更新,本身Django内部的数据库表State同样也得跟着一起维护。加上现在涉及到的一些外键,变得更加的麻烦。全网资料不多,参考了Django的相关Ticket和这份资料,成功的在生产环境实现了Model在不同App之间的迁移。

迁移思路是先生成新的Model,然后在 Django State 层面将逻辑指向新的Model,不改动数据库表结构。再修改数据库结构,将旧表重命名成新表。最后Django State层面删除旧表,数据库表结构不改动。完成了Model迁移并且不损失数据。单个Model迁移的步骤如下。多个Model需要迁移,请按顺序逐个操作。数据库表变动是高风险操作,务必小心谨慎。

0. 创建数据库备份,这是翻车之后的救命稻草

1. 将旧的Model代码复制到新的App下的models.py,将全部的使用旧Model的外键更新成新的Model

2. 执行

python manage.py makemigrations

3. 编辑 migration 文件,将自动生成的 operations 部分按照如下修改:

1
2
3
4
5
6
7
8
operations=[
migrations.SeparateDatabaseAndState(
database_operations=None,
state_operations=[
# 自动生成的 operations 复制到这里。
]
),
]

4. 删除旧Model的代码,执行

python manage.py makemigrations

5. 编辑 migration 文件,两个操作:

  • 将上一步全部的新生成的 migration 文件添加到 dependencies
1
2
3
dependencies = [
# 将上一步全部的新生成的 migration 文件添加到这里
]
  • 将自动生成的 operations 部分按照如下修改
1
2
3
4
5
6
7
8
9
10
11
12
operations = [
migrations.SeparateDatabaseAndState(
database_operations=[
migrations.AlterModelTable('mymodel', 'new_app_mymodel'),
# 假设将 Account 这个 Model 从 hello 这个 App 移动到 world 下,应该修改成
# migrations.AlterModelTable('account', 'world_account'),
],
state_operations=[
# 自动生成的 operations 复制到这里。
]
),
]

6. 检查上面的流程,知道自己每一步干的什么,没有问题的话,执行

python manage.py migrate

检查 and 测试。没有问题,Model迁移成功。

赏

很惭愧,就做了一点微小的工作

支付宝
微信
  • django
  • database
P1003 等价表达式
年初小站更新记录
Copyrights © 2009 - 2025 Sink. All Rights Reserved.
Hexo Illya
  • 所有文章
  • 友情链接
  • +1s

tag:

  • ubuntu
  • dns
  • deepin
  • rfc
  • django
  • database
  • work
  • python
  • greenplum
  • postgres
  • how-to
  • linux
  • react
  • firefox
  • nginx
  • vijos
  • go
  • toml
  • tools
  • usaco
  • IPv6
  • gpg

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 浮云计算
  • 成成个人学习小站
  • Victor 的自留地
  • amtoaer
  • lxkaka
  • 酷壳CooShell
  • 曜彤.手记

一个人的命运啊,当然要靠自我奋斗,但是也要考虑到历史的行程。

很惭愧,就做了一点微小的工作,谢谢大家。