Django ORM 实现天表的查询

概述

对于日志、计量等大数据进行记录统计时,如果将数据放入一张表存储,查询效率将会下降严重。

因此多采用按照时间分表方式进行存储。由于API层是使用Django框架开发,所以需要考虑Django的ORM框架怎样才能实现。

实现方式

因为表结构是相同的,只是表名不同,所以考虑定义Model基类的方式,动态生成表名不同的Model类来进行查询使用。下面是动态获取Model的例子:

# -*-coding:utf-8
from django.db import models
from django.db import connection


def get_model(table_name, base_model, options=None):
    """指定表名与基类,获取新的Model"""

    class DynamicModelMetaclass(models.base.ModelBase):
        def __new__(cls, name, bases, attrs):
            return models.base.ModelBase.__new__(cls, table_name, bases, attrs)

    class DynamicModel(base_model):
        __metaclass__ = DynamicModelMetaclass

        @staticmethod
        def is_exists():
            return table_name in connection.introspection.table_names()

        @classmethod
        def create_table(model_cls):
            if not model_cls.is_exists():
                with connection.schema_editor() as schema_editor:
                    schema_editor.create_model(model_cls)

        @classmethod
        def drop_table(model_cls):
            if model_cls.is_exists():
                with connection.schema_editor() as schema_editor:
                    schema_editor.delete_model(model_cls)

        class Meta:
            db_table = table_name
        if options:
            for key, value in options.items():
                setattr(Meta, key, value) 

    return DynamicModel

Model获取到以后就可按照正常的ORM使用方式来编写相关代码了。