如何在Django中对字段进行数据库分区?

5

我有一个带有多个字段的Django模型,它映射到一个MySQL数据库。现在在该模型中有一个日期时间字段,我想设置分区

该模型如下所示:

class Packet(models.Model):
    device = models.ForeignKey(Device)
    packet_time = models.DateTimeField(default=timezone.now())
    # Location Details
    signal = models.CharField(max_length=2, default='A')
    lat = models.FloatField(default=None, null=True)
    lat_indicator = models.CharField(max_length=1, default='')
    lng = models.FloatField(default=None, null=True)
    lng_indicator = models.CharField(max_length=1, default='')
    address = models.CharField(max_length=64, default='NA')
    speed = models.FloatField(default=None, null=True)
    orientation = models.FloatField(default=None, null=True)
    #House Keeping Items
    dor = models.DateTimeField(default=timezone.now()) # <= Want to partition this for weekly basis. 
    dirty = models.BooleanField(default=False)

请为我提供建议,如何实现这一目标。

3
我认为你需要在Django中使用包。不确定。这些是可以使用的包:

https://github.com/danfairs/django-parting

https://pypi.python.org/pypi/django-db-parti#id2
- Anish Shah
1个回答

5
正如Max在评论中提到的那样,django-db-parti已经被architect取代。Github链接在这里,更多文档请参考readthedocs

原回答:

django-db-parti包存在,似乎符合你的条件。Github链接在这里

文件的MySQL部分说明如下:

Django DB Parti中MySQL的分区实现是混合方式,一半在Python层面,一半在数据库层面。不幸的是,MySQL不支持在触发器或函数中动态sql,而且在触发器中调用的函数也不能使用动态sql,因此自动创建分区的唯一方法是在Python层面计算所有内容,然后基于这些计算创建必要的sql语句,并将该语句发送到数据库。

以下是其限制:

不是所有的分区类型都被支持。新类型将在Django DB Parti的下一个版本中添加。 由于它没有调用模型的save()方法,因此无法在批量插入(即Django的bulk_create()方法)中使用分区。目前还没有已知的方法来消除这个限制。 只能从低到高创建新的分区,你可以通过MySQL的特殊命令REORGANIZE PARTITION来克服这个问题,你必须从数据库控制台发出该命令。你可以在MySQL的文档中了解更多信息。我们计划在未来的Django DB Parti版本中删除这个限制。 你的分区配置发生在模型的Meta类中。

请注意,django-db-parti已被弃用,建议使用Architect包。 PyPI:http://pypi.python.org/pypi/architect Github:https://github.com/maxtepkeev/architect Docs:http://architect.readthedocs.org - Max Tepkeev
你还应该注意到,现在Postgres支持本地分区,无需触发器,这是一个更好的解决方案,可以在Python3 + Django 2+上使用https://github.com/chaitin/django-pg-partitioning。 - Kevin Parker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接