单张表数据量非常大的时候,可以按业务将数据拆倒不同的表里。

如: 统计广告数据,原先所有的广告上报数据(KTV的id,(包房的id,)广告的id,播放次数等数据会上报到服务器),数据量非常大。只统计的某某广告的投放情况,其他广告的数据不会对其他广告的数据有影响,这里可以简单的进行一次分表。不同的广告上报数据放各自的表里。

ad_stat_1, ad_stat_2….

不多说,直接上代码

from sqlalchemy import Column
from sqlalchemy.dialects.mysql import INTEGER, VARCHAR, ENUM, TINYINT, DATE, DATETIME, TIMESTAMP, DECIMAL, BIGINT, TEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


aid_class_dict = {}
Base = declarative_base()
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()


class AdStatClass(Base):
    __abstract__ = True
    # __tablename__ should be 'ad_stat_%s'

    id = Column(INTEGER(11), primary_key=True)
    ktv_id = Column(INTEGER(11))
    cnt = Column(INTEGER(11))
    time = Column(INTEGER(24))
    post_date = Column(DATETIME)


def get_ad_stat_model(aid):

    def get_class_name_and_table_name(aid):
        return 'AdStatClass%s'%aid, 'ad_stat_%s'%aid

    if aid not in aid_class_dict:
        cls_name, table_name = get_class_name_and_table_name(aid)
        cls = type(cls_name, (AdStatClass, ), {'__tablename__': table_name})
        aid_class_dict[aid] = cls
    return aid_class_dict[aid]


model1 = get_ad_stat_model(1)
session.query(model1).all()  # 广告1的所有数据

# 添加1条广告2的数据
model2 = get_ad_stat_model(2)
data = model2(ktv_id=2, cnt=2, time=12, post_date='2017-05-16')
session.add(data)
session.commit()