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使用方式来编写相关代码了。