Flask sqlalchemy 分表实现 及 相关操作

1,599 阅读1分钟

业务需求 如果单表的数据量过大 需要分表操作 以下是个人的用法 以及操作 希望有错误的地方 大家指出来 有更优方法的朋友可以不吝赐教 先行谢过~

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()


参考链接 blog.csdn.net/weixin_3420… 十分感谢