业务需求 如果单表的数据量过大 需要分表操作
以下是个人的用法 以及操作
希望有错误的地方 大家指出来
有更优方法的朋友可以不吝赐教
先行谢过~
from api.extensions import db
class XoTree(object):
_mapper = {}
@staticmethod
def model(conf_id):
class_name = 'xo_tree_%s' % conf_id
ModelClass = XoTree._mapper.get(class_name, None)
if ModelClass is None:
ModelClass = type(class_name, (db.Model,), {
'__module__': __name__,
'__name__': class_name,
'__tablename__': 'xo_tree_%s' % conf_id,
'tree_id': db.Column(db.Integer, primary_key=True),
'created_at': db.Column(db.DateTime, default=lambda: datetime.datetime.now()),
'updated_at': db.Column(db.DateTime, onupdate=lambda: datetime.datetime.now()),
'portfolio_id': db.Column(db.Integer, index=True),
'portfolio': db.Column(db.String(128)),
'children': db.Column(db.Text()),
'trading_day': db.Column(db.String(32), index=True),
'trading_day_timestamp': db.Column(db.BIGINT),
})
XoTree._mapper[class_name] = ModelClass
cls = ModelClass()
return cls
这样的一个class就可以实现分表的操作了
接下来讲如何操作表
from sqlalchemy import desc
# 创建表
obj = XoTree.model(conf_id)
obj.metadata.create_all(db.engine)
# 单条数据新增
obj = XoTree.model(conf_id)
obj.trading_day = 20200101
db.session.add(obj)
#批量插入
db.session.execute(obj.__table__.insert(), data_list)
# 检查表是否存在
tree_exsist = db.engine.dialect.has_table(db.engine, 'xo_tree_%s' % conf_id)
# 查询
tree_obj = XoTree.model(conf_id)
tree_node = tree_obj.query.filter_by(trading_day=trading_day, portfolio_id=node['portfolio_id']).first()
# 查询最新数据 , 排序
obj = XoNodeData.model(conf_id)
obj.query.order_by(desc('trading_day')).first().trading_day
# 删除表中所有数据
if tree_exsist:
tree_obj = XoTree.model(conf_id)
tree_obj.query.delete()
db.session.commit()
参考链接
https://blog.csdn.net/weixin_34204057/article/details/85737013
十分感谢