今天拿到一个需求,数据有很多,我们需要把数据分表存;于是去找了大量的django分表资料.并且实现了,以留下一个记录

models.py

from django.db import models
from django.db import connection

class Book(models.Model):
    code = models.CharField(max_length=18,  verbose_name="编码")
    name = models.CharField(max_length=18,   verbose_name="名称")

    class Meta:
        db_table = 'book'
        verbose_name = '书籍表'
        verbose_name_plural = verbose_name
        abstract = True
        
    @classmethod
    def get_table_name(cls, id):
        # 修改表后缀
        return f'{table_prefix}model_{id}'

    @classmethod
    def is_exists(cls, id):
        # 判断model是否存在
        table_name = cls.get_table_name(id)
        return table_name in connection.introspection.table_names()

    @classmethod
    def sharding_get(cls, id):
        # 获取model实例
        new_cls = cls.get_table_model(id)
        return new_cls

    _table_model = {}

    @classmethod
    def get_table_model(cls, id: str):
        """
        创建模型
        :param no:
        :return: 
        """
        # 要连接的数据表,
        table_name = cls.get_table_name(id)
        if table_name in cls._table_model:
            return cls._table_model[table_name]

        # 这里会重新设置创建的model的名字,每个model名字都是动态的,不是BaseTable
        class Metaclass(models.base.ModelBase):
            def __new__(cls, name, bases, attrs):
                name += id  # 这是Model的name.
                return models.base.ModelBase.__new__(cls, name, bases, attrs)

        # 注意继承的顺序
        class BaseTable(Book, metaclass=Metaclass):
            class Meta:
                abstract = False
                # proxy = True  # 核心即 proxy + _meta.db_table
                db_table = table_name

        BaseTable._meta.db_table = table_name
        cls._table_model[table_name] = BaseTable
        return BaseTable

    @classmethod
    def create_model(cls, id):
        # 创建model实例
        table_name = cls.get_table_name(id)
        cls._meta.db_table = table_name
        if not table_name in connection.introspection.table_names():
            with connection.schema_editor() as schema_editor:
                schema_editor.create_model(cls)
       

使用方式

# 创建表
 Book.create_model(2)

# 使用表
book = Book.sharding_get(2)

# 查询
book.objects.all()

# 新增
book.objects.create()

# 修改
book.objects.filter(id=1).update(name="A")

# 删除
book.objects.filter(id=1).delete(name="A")
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐