以下内容为原创,转载请注明出处!
最近遇到一个需求,发现有张表有1亿条数据以上,所以需要分表,下面演示下django怎么分表(用dataid%10,来分了10张表,也可以用uuid替代id来分)。
首页分表,可以直接利用navicat直接复制表,如下图:
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)