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 ...
随机推荐
- Response.Redirect在新窗口打开网页
来自:http://www.woosky.net/show.asp?id=761 Respose.Write("<script language='javascript'>win ...
- C++流格式控制符的使用【来自网络】
注意添加<iomanip>头文件. 使用控制符控制输出格式 控制符 作用 dec 设置整数的基数为10 hex 设置整数的基数为16 oct 设置整数的基数为8 setbase(n) 设置 ...
- python之os模块
#!/usr/bin/env python3# _*_ coding:utf-8 _*_ import os os.getcwd()#os.chdir('path')print(os.curdir)p ...
- JavaScript闭包演示
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8" /> <title&g ...
- HTTP请求方法对照表
根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELE ...
- jsp中的内置对象(9个)、作用
jsp内置对象 定义:可以不加声明就在JSP页面脚本(Java程序片和Java表达式)中使用的成员变量 JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应): 1.request对象 客户 ...
- ABP系列文章总目录:
转自:http://www.cnblogs.com/mienreal/p/4528470.html 1.ABP总体介绍 2.ASP.NET Boilerplate入门 3.ABP分层架构 4.ABP模 ...
- 初级——程序如何打包成apk文件
将Eclipse Android项目打包成APK文件是本文要介绍的内容,主要是来了解并学习Eclipse Android打包的内容,具体关于Eclipse Android内容的详解来看本文.Eclip ...
- Photoshop CS3 如何汉化
1. 下载汉化包 http://download.csdn.net/detail/yangtian1158/8740959 2. 将下载的.bat文件放到CS3的安装目录里即可 C:\Program ...
- HackerRank "Training the army" - Max Flow
First problem to learn Max Flow. Ford-Fulkerson is a group of algorithms - Dinic is one of it.It is ...