flask-sqlalchemy分表解决方案
转自:http://ju.outofmemory.cn/entry/61448
关键词:
flask-sqlalchemy, sqlalchemy, 分表,分库
大型系统、海量数据肯定涉及到分库分表这些提高效率的手段。由于sqlalchemy的orm思想是一张表对应一个对象,那么当我们有N张相同结构只是表名有区别的分表,sqlalchemy orm怎样处理呢。比如有如下表:
CREATE TABLE `goods_desc_0` (
`goods_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
`goods_desc` text NOT NULL COMMENT '商品详细描述',
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商品信息详情'
CREATE TABLE `goods_desc_1` (
`goods_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
`goods_desc` text NOT NULL COMMENT '商品详细描述',
PRIMARY KEY (`goods_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商品信息详情'
class GoodsDesc(db.Model):
__tablename__ = 'goods_desc'
goods_id = db.Column(db.Integer, primary_key=True)
goods_desc = db.Column(db.Text, default=None)
def __str__(self):
return "GoodsDesc => { \
goods_id:%d, goods_desc:'%s'}" % (
self.goods_id, self.goods_desc)
__repr__ = __str__
# 代码示例
goods_id = 101
table_index = goods_id%2
table_name = 'goods_desc_%d' % table_index
GoodsDesc.__table__.name = table_name
gd = GoodsDesc.query.filter(GoodsDesc.goods_id == goods_id).first()
# 这样写虽然也能工作,但是是非常危险的,因为GoodsDesc.__table__是静态全局变量,
# 而且不是web程序request级别的,是app context的,非常不安全。
经过N次Google,终于找到解决方案,而且代码写起来也很优雅。代码如下:
class GoodsDesc(object):
_mapper = {}
@staticmethod
def model(goods_id):
table_index = goods_id%100
class_name = 'GoodsDesc_%d' % table_index
ModelClass = GoodsDesc._mapper.get(class_name, None)
if ModelClass is None:
ModelClass = type(class_name, (db.Model,), {
'__module__' : __name__,
'__name__' : class_name,
'__tablename__' : 'goods_desc_%d' % table_index,
'goods_id' : db.Column(db.Integer, primary_key=True),
'goods_desc' : db.Column(db.Text, default=None),
})
GoodsDesc._mapper[class_name] = ModelClass
cls = ModelClass()
cls.goods_id = goods_id
return cls
# 外部代码调用如例如下:
# -----------------------
# 新增插入
gdm = GoodsDesc.model(goods_id)
gdm.goods_desc = 'desc'
db.session.add(gd)
# 查询
gdm = GoodsDesc.model(goods_id)
gd = gdm.query.filter_by(goods_id=goods_id).first()
flask-sqlalchemy分表解决方案的更多相关文章
- CRL快速开发框架系列教程十一(大数据分库分表解决方案)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- .Net下你不得不看的分表分库解决方案-多字段分片
.Net下你不得不看的分表分库解决方案-多字段分片 介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 ...
- efcore在Saas系统下多租户零脚本分表分库读写分离解决方案
efcore在Saas系统下多租户零脚本分表分库读写分离解决方案 ## 介绍 本文ShardinfCore版本x.6.0.20+ 本期主角: - [`ShardingCore`](https://gi ...
- mysql分库分表那些事
为什么使用分库分表? 如下内容,引用自 Sharding Sphere 的文档,写的很大气. <ShardingSphere > 概念 & 功能 > 数据分片> 传统的 ...
- “ShardingCore”是如何针对分表下的分页进行优化的
分表情况下的分页如何优化 首先还是要给自己的开原框架打个广告 sharding-core 针对efcore 2+版本的分表组件,首先我们来快速回顾下目前市面上分表下针对分页常见的集中解决方案 分表解决 ...
- efcore使用ShardingCore实现分表分库下的多租户
efcore使用ShardingCore实现分表分库下的多租户 介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业 ...
- .Net分表分库动态化处理
介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 背景 最近有个小伙伴来问我,分表下他有一批数据,这个 ...
- NetCore框架WTM的分表分库实现
介绍 本期主角: ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 WTM WalkingTec.Mvvm框架(简称W ...
- .Net下极限生产力之efcore分表分库全自动化迁移CodeFirst
.Net下极限生产力之分表分库全自动化Migrations Code-First ## 介绍 本文ShardinfCore版本x.6.x.x+ 本期主角: - [`ShardingCore`](htt ...
随机推荐
- Q5: Remove Duplicates from Sorted Array
问题描述: Given a sorted array, remove the duplicates in place such that each element appear only once a ...
- P1003 越野跑【tyvj】
/*=========================================================== P1003 越野跑 描述 Description 为了能在下一次跑步比赛中有 ...
- 使用prototype 对象定义类成员
使用prototype 对象定义类成员上一节介绍了类的实现机制以及构造函数的实现,现在介绍另一种为类添加成员的机制:prototype 对象.当new 一个function 时,该对象的成员将自动赋给 ...
- Golang_test
package main import ( "fmt" "time" ) func GetName() { //没事玩一下循环 for i := 0; i &l ...
- CentOS6.6 安装 Tengine 笔记
Tengine官网上有个非常简单的教程,中间并未涉及到一些常用的设置,所以仅供参考.一下午为本人的安装步骤及过程. 1.安装必要的编译环境好 由于Tengine安装需要使用源代码自行编译,所以在安装前 ...
- (五)Linux引导流程解析
目录 Linux引导流程 Linux运行级别 Linux启动服务管理 GRUB配置与应用 启动故障分析与解决 Linux引导流程 Linux系统引导流程如下图: 固件(Firmware)就是写入ERO ...
- js禁止从浏览器缓存读取消息
$.ajaxSetup ({ cache: false //设置成false将不会从浏览器缓存读取信息 });
- (转)用Eclipse进行C++开发时Bianry not found的问题解决
本文转载自:http://blog.csdn.net/baimafujinji/article/details/49722399 由于Visual Studio体积过于庞大,很多人选择在Eclipse ...
- SVN学习之参数定义及设置
http://jackyrong.iteye.com/blog/238835 conf目录中打开svnserve.conf ,去掉注释,搞成如下这样 [general] anon-access = r ...
- 打开PDF文件弹出阅读未加标签文档的解决方法
在“高级”菜单的“辅助工具”选中“设置助手”,然后点选“设置屏幕阅读器选项”,下一步之后,将“忽略已加标签文档的阅读顺序”和“添加标签到文档之前进行确认”(有的版本显示的是“为文档加标签前确认”)前面 ...