以下内容为原创,转载请注明出处!


最近遇到一个需求,发现有张表有1亿条数据以上,所以需要分表,下面演示下django怎么分表(用dataid%10,来分了10张表,也可以用uuid替代id来分)。


首页分表,可以直接利用navicat直接复制表,如下图:


table.png

models文件:

class Point(models.Model):

    dataid = models.IntegerField('监测点ID', db_index=True)

    class Meta:
        verbose_name_plural = verbose_name = '监测点'


    def __unicode__(self):
        return self.name

    # filter过滤,通过dataid来确定存储在哪张表(同样的,我们也可以给get方法写个def)
    @classmethod
    def filter_table(Class, dataid):
        slice = int(dataid) % 10
        if slice == 0:
            db_name = 'iot_point'
        elif slice == 1:
            db_name = 'iot_point_copy'
        else:
            db_name = 'iot_point_copy{}'.format(slice)
        Class._meta.db_table = db_name
        return Class.objects.filter(dataid=dataid)


    # 根据dataid来区分存在哪个表中
    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        slice = int(self.dataid) % 10
        if slice == 0:
            db_name = 'iot_point'
        elif slice == 1:
            db_name = 'iot_point_copy'
        else:
            db_name = 'iot_point_copy{}'.format(slice)
        self._meta.db_table = db_name
        super(Point, self).save(force_insert,force_update,using,update_fields)


# 下面语句最终会在iot_point_copy3下面存储一条数据
point = Point.objects.create(dataid=63)
# 下面语句会直接去iot_point_copy3查询语句
print Point.setDb_table(dataid=63)