sqlalchemy分表实现

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

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

ad_stat_1, ad_stat_2….

不多说,直接上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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()