资讯专栏INFORMATION COLUMN

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

vpants / 3429人阅读

摘要:撸了个数据迁移工具支持字段映射和动态字段转化。欢迎,起因最近参与了公司系统的重构,重构基本完成后,由于数据库表结构变化很大,很多小组都需要数据迁移。主要功能使用强大的系统灵活的进行数据迁移工作。

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

支持字段映射和动态字段转化。 欢迎 star,issue
https://github.com/FingerLiu/...

起因

最近参与了公司系统的重构,重构基本完成后,由于数据库表结构变化很大,很多小组都需要数据迁移。如果都写 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"

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42084.html

相关文章

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

    摘要:撸了个数据迁移工具支持字段映射和动态字段转化。欢迎,起因最近参与了公司系统的重构,重构基本完成后,由于数据库表结构变化很大,很多小组都需要数据迁移。主要功能使用强大的系统灵活的进行数据迁移工作。 撸了个 django 数据迁移工具 django-supertube 支持字段映射和动态字段转化。 欢迎 star,issuehttps://github.com/FingerLiu/... ...

    Profeel 评论0 收藏0
  • 单手了个springboot+mybatis+druid

    摘要:配置想想,我们需要哪些数据库要用到,数据库连接池要用到桥接器要用到,因此要仓库点我去仓库中找到搜索这些加进去。 本文旨在用最通俗的语言讲述最枯燥的基本知识 最近身边的程序员掀起了学习springboot的热潮,说什么学会了springboot在大街上就可以横着走、什么有了springboot妈妈再也不担心我的编程了、什么BAT都喜欢的框架...听得作者那个心痒痒的,于是找了个时间,下载...

    adie 评论0 收藏0
  • [小程序]撸了第一个小程序

    摘要:豆瓣这几天看了下小程序的文档,然后花了点时间写了个没什么含量的小程序。后来选择了豆瓣,又发现小程序屏蔽了豆瓣的,好在网上有大神架了代理服务器。 豆瓣API 这几天看了下小程序的文档,然后花了点时间写了个没什么含量的小程序。本来想自己写下API接口,但是小程序请求的域名既要求备案又要求HTTPS,太麻烦遂放弃。后来选择了豆瓣API,又发现小程序屏蔽了豆瓣的API,好在网上有大神架了代理服...

    woshicixide 评论0 收藏0
  • Python学习之路17-Django入门

    摘要:编程从入门到实践笔记。执行命令后,项目的根目录下会多出一个名为的数据库文件。下面创建一个主题类用户学习的主题返回模型的字符串表示类是中的一个定义了模型基本功能的类。这种交互式环境称为,常用语测试项目和排除故障。 《Python编程:从入门到实践》笔记。从本篇开始将是该书的最后一个项目,将用3篇文章来介绍Django的基础。完成一个学习笔记的小网站。 1. 前言 在本篇中,我们将: 用...

    shadowbook 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<