撸了个 django 数据迁移工具 django-supertube

支持字段映射和动态字段转化。 欢迎 star,issue

https://github.com/FingerLiu/django-supertube

起因

最近参与了公司系统的重构,重构基本完成后,由于数据库表结构变化很大,很多小组都需要数据迁移。如果都写 sql 的话,要做很多重复的工作。于是去搜了下 django 有没有相关的工具,很遗憾没有搜到,于是自己撸了这个数据迁移的轮子。

主要功能

A powerful django migration tool to migrate from latency database to new databse using awesome django ORM

使用 django 强大的 ORM 系统灵活的进行数据迁移工作。

目前包含以下功能点:

  • 支持相同字段自动映射
  • 批量写入
  • 支持修改字段映射
  • 支持通过调用函数的方式
  • 自动修复 postgres sequence
  • 实时进度提醒
  • 数据量大时支持并行执行(开发中)

django-supertube

A powerful django migration tool to migrate from latency database to new databse using awesome django ORM

例子

settings.py

  1. DATABASES = {
  2. 'default': config('DATABASE_URL', cast=db_url),
  3. 'latency': config('LATENCY_DATABASE_URL', cast=db_url)
  4. }

management/commands/mig_01_user.py

  1. from django.utils import timezone
  2. from si.tools.supertube import SuperTube, TubeSet
  3. """
  4. class LatencyUser:
  5. email
  6. password
  7. age
  8. class User:
  9. email
  10. age
  11. username
  12. password
  13. is_admin
  14. create_datetime
  15. 例子从 latency 数据库的 LatencyUser 取数据迁移到 default 数据库的 User 中:
  16. - 新加 username 字段,数据值从原 email 字段取
  17. - 修改 age 字段变为原来的 age+1
  18. - 新加 create_datetime 字段
  19. - 新加 is_admin 字段,默认值为 False
  20. """
  21. class Command(BaseCommand):
  22. def handle(self, *args, **options):
  23. kwargs = {
  24. 'mapping': {
  25. 'username': 'email',
  26. 'age': lambda obj: obj.age + 1,
  27. 'create_datetime': timezone.now()},
  28. 'defaults': {'is_admin': False}
  29. 'source_db': 'whistler'
  30. }
  31. st = SuperTube(LatencyUser, User, **kwargs)
  32. st.run(stop_on_error=True)

迁移工具 SuperTube 和 TubeSet 更多说明和例子参考这个文档

一个为 latency 中的旧数据建表的例子:

  1. class Order(models.Model):
  2. sn = models.CharField(u'领用单编号', max_length=100)
  3. created = models.DateTimeField(u'创建时间', auto_now_add=True)
  4. apply_qty = models.IntegerField(u'计划领用数量', blank=True, null=True)
  5. # TODO 1 将原 model 中的外键字段名改为 原字段名+_id ,类型改为 IntegerField
  6. # batch = models.ForeignKey('stock.Batch', blank=True, null=True)
  7. batch_id = models.IntegerField('stock.Batch', blank=True, null=True)
  8. purpose = models.PositiveIntegerField(u'领用用途', choices=PURPOSES, blank=True, null=True)
  9. # platform = models.ForeignKey('si.Platform', blank=True, null=True, related_name='+')
  10. platform_id = models.IntegerField('si.Platform', blank=True, null=True)
  11. def __unicode__(self):
  12. return self.sn
  13. class Meta:
  14. verbose_name = u'Order'
  15. # TODO 2 注释掉原表中的 unique_together
  16. # unique_together = (
  17. # ('platform', 'request_id'),
  18. # ('platform', 'outer_id'),
  19. # )
  20. # TODO 3 managed 设为 False
  21. managed = False
  22. # TODO 4 指定 db table
  23. db_table = 'cardbox_applyvoucher'

撸了个 django 数据迁移工具 django-supertube的更多相关文章

  1. Django数据导入

    从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1.7, Django 1. ...

  2. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  3. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  4. Django 数据表更改

    Django 数据表更改 « Django 开发内容管理系统(第四天) Django 后台 » 我们设计数据库的时候,早期设计完后,后期会发现不完善,要对数据表进行更改,这时候就要用到本节的知识. D ...

  5. Django数据查询中对字段进行排序

    Django数据查询中对字段进行排序   第一种方法:使用order_by进行排序 Articlelist = Article.objects.filter(**kwargs).order_by('n ...

  6. 【原】Django数据Model层总结

    vlaues - 单条记录 - <class 'dict'> 多条记录 - <class 'django.db.models.query.QuerySet'> vlaues_l ...

  7. django学习-10.django连接mysql数据库和创建数据表

    1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...

  8. 2 django系列之django分页与templatetags

    preface 当页面出现的条目多的时候,我们就需要使用分页功能了.Django作为一个知名的web框架,自然也提供了分页功能,下面说说它. Python-shell 练练手 在python下入手 先 ...

  9. Django学习之django自带的contentType表 GenericRelation GenericForeignKey

    Django学习之django自带的contentType表   通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...

随机推荐

  1. [Emacs] Emacs使用介绍

    详细,可参考该文档(转载):Emacs 快速指南 - 原生中文手册 C-x C-c 关闭Emacs会话 C-v/M-v 向前/后翻页 C-n/C-p 光标向下/上移一行 C-f/C-b 光标向前/后移 ...

  2. JSP自学笔记

    基础语法 1.对比 JSP:java平台安全性高,适合开发大型的.企业级的web应用程序: ASP.net:.NET平台简单易学,安全性和跨平台性差: PHP:简单高效,成本低,开发周期短,适合中小型 ...

  3. 洛谷P3802 小魔女帕琪

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  4. 移动web 的viewport设置注意事项的详细解释 六一快乐=-_-_

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Uva1149

    每个bin最多只能放两个,所以最佳的贪心策略是从大的开始放,如果有空间放第二个,尽量放最大的. #include <bits/stdc++.h> using namespace std; ...

  6. 惠普台式机UEFI BIOS设置U盘启动

    开机按F9进入选中安装u盘启动软件的u盘,即可进入u盘启动选项,将于U盘安装系统操作一致 如:F9未找到U盘,可进行如下操作 1.开机时点击F10键进入BIOS更改选项:  更改 Advanced-- ...

  7. vim 编辑器设置tab缩进

    创建 ~/.vimrc文件,写入 set tabstop=4 ,保存 原文

  8. tomcat的webapps下放置多个项目时会出现很多exception

    今天干了一件比较逗比的事,在tomcat的项目目录wepapps下又新建了一个文件夹backup,然后在backup下放置了之前项目的war包...然后启动tomcat的时候各种exception 大 ...

  9. python多继承(新式类)一

    最近在学习python的多重继承. 先来了解下多重继承的概念,所谓多重继承,是指python的类可以有两个以上父类,也即有类A,类B,类C,C同时继承类A与类B,此时C中可以使用A与B中的属性与方法. ...

  10. HttpClient4.6的使用

    禁止转载,如需转载请联系本人 1)简介: HttpClient是apache的开源项目,弥补了Java自带的URLConnection功能不足,操作繁琐的缺点. 2)简单使用: a)get方式请求 / ...