撸了个 django 数据迁移工具 django-supertube
撸了个 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
DATABASES = {
'default': config('DATABASE_URL', cast=db_url),
'latency': config('LATENCY_DATABASE_URL', cast=db_url)
}
management/commands/mig_01_user.py
from django.utils import timezone
from si.tools.supertube import SuperTube, TubeSet
"""
class LatencyUser:
email
password
age
class User:
email
age
username
password
is_admin
create_datetime
例子从 latency 数据库的 LatencyUser 取数据迁移到 default 数据库的 User 中:
- 新加 username 字段,数据值从原 email 字段取
- 修改 age 字段变为原来的 age+1
- 新加 create_datetime 字段
- 新加 is_admin 字段,默认值为 False
"""
class Command(BaseCommand):
def handle(self, *args, **options):
kwargs = {
'mapping': {
'username': 'email',
'age': lambda obj: obj.age + 1,
'create_datetime': timezone.now()},
'defaults': {'is_admin': False}
'source_db': 'whistler'
}
st = SuperTube(LatencyUser, User, **kwargs)
st.run(stop_on_error=True)
迁移工具 SuperTube 和 TubeSet 更多说明和例子参考这个文档
一个为 latency 中的旧数据建表的例子:
class Order(models.Model):
sn = models.CharField(u'领用单编号', max_length=100)
created = models.DateTimeField(u'创建时间', auto_now_add=True)
apply_qty = models.IntegerField(u'计划领用数量', blank=True, null=True)
# TODO 1 将原 model 中的外键字段名改为 原字段名+_id ,类型改为 IntegerField
# batch = models.ForeignKey('stock.Batch', blank=True, null=True)
batch_id = models.IntegerField('stock.Batch', blank=True, null=True)
purpose = models.PositiveIntegerField(u'领用用途', choices=PURPOSES, blank=True, null=True)
# platform = models.ForeignKey('si.Platform', blank=True, null=True, related_name='+')
platform_id = models.IntegerField('si.Platform', blank=True, null=True)
def __unicode__(self):
return self.sn
class Meta:
verbose_name = u'Order'
# TODO 2 注释掉原表中的 unique_together
# unique_together = (
# ('platform', 'request_id'),
# ('platform', 'outer_id'),
# )
# TODO 3 managed 设为 False
managed = False
# TODO 4 指定 db table
db_table = 'cardbox_applyvoucher'
撸了个 django 数据迁移工具 django-supertube的更多相关文章
- Django数据导入
从网上下载的一些数据,excel表格,xml文件,txt文件等有时候我们想把它导入数据库,应该如何操作呢? 以下操作符合 Django版本为 1.6 ,兼顾 Django 1.7, Django 1. ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- python学习笔记--Django入门三 Django 与数据库的交互:数据建模
把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...
- Django 数据表更改
Django 数据表更改 « Django 开发内容管理系统(第四天) Django 后台 » 我们设计数据库的时候,早期设计完后,后期会发现不完善,要对数据表进行更改,这时候就要用到本节的知识. D ...
- Django数据查询中对字段进行排序
Django数据查询中对字段进行排序 第一种方法:使用order_by进行排序 Articlelist = Article.objects.filter(**kwargs).order_by('n ...
- 【原】Django数据Model层总结
vlaues - 单条记录 - <class 'dict'> 多条记录 - <class 'django.db.models.query.QuerySet'> vlaues_l ...
- django学习-10.django连接mysql数据库和创建数据表
1.django模型 Django对各种数据库提供了很好的支持,包括:PostgreSQL.MySQL.SQLite.Oracle. Django为这些数据库提供了统一的调用API. 我们可以根据自己 ...
- 2 django系列之django分页与templatetags
preface 当页面出现的条目多的时候,我们就需要使用分页功能了.Django作为一个知名的web框架,自然也提供了分页功能,下面说说它. Python-shell 练练手 在python下入手 先 ...
- Django学习之django自带的contentType表 GenericRelation GenericForeignKey
Django学习之django自带的contentType表 通过django的contentType表来搞定一个表里面有多个外键的简单处理: 摘自:https://blog.csdn.net/a ...
随机推荐
- .Net Core中依赖注入服务使用总结
一.依赖注入 引入依赖注入的目的是为了解耦和.说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用.这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将 ...
- [CentOS7] 使用磁盘分割建立swap
声明:本文主要总结自:鸟哥的Linux私房菜-第七章.Linux 磁碟與檔案系統管理,如有侵权,请通知博主 通过 vim /etc/fstab 使该新建的swap分区每次开机都自己挂载 至此,已经完成 ...
- window下安装composer步骤(linux待研究)
window下安装composer步骤--注意(安装完之后需要重启电脑才能生效) 转发:https://blog.csdn.net/wengedexiaozao/article/details/798 ...
- PAT L3-010【完全二叉树】
静态建树判一下1-n是不是为空就好了,如果有空的 就说明不是complete binary tree (和线段树建树差不多啊)Left=2*root:Right=2*root+1 #include ...
- 洛谷P1164 小A点菜(01背包求方案数)
P1164 小A点菜 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过u ...
- 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- Android Gradle 学习笔记(六):Gradle 插件
Gradle 本身提供了一些基本的概念和整体核心的框架,其他用于描述真实使用场景的都可以通过插件扩展的方式来实现.这样就可以通过抽象的方式提供一个核心的框架,其他具体的功能和业务都通过插件扩展的方式来 ...
- windows驱动环境配置vs2010+wdk7600
安装wdk后 要勾选集成VSIX选项到vs里面,不然vs里面新建项目时候找不到windows Driver 最简单的方式是安装wdk7600+vs2010+VisualDDK-1.5.7 这三个软件 ...
- EIGRP-4-调整接口度量参数来影响路径选择
从EIGRP度量参数的讨论中可以看出.能够手动配置的EIGRP度量参数只有带宽和延迟. 通过使用bandwidth命令强迫EGIRP使用或不使用某条特定路径.看起来是一个很有吸引力的做法.不过这个问题 ...
- IE8浏览器总是无响应或卡死崩溃怎么办
IE8浏览器总是无响应或卡死崩溃怎么办 2016-05-11 11:22:31 来源:百度经验 作者:qq675495787 编辑:Jimmy51 我要投稿 IE在打开某些网页的时候经常崩溃或无响应, ...