转自:http://ju.outofmemory.cn/entry/61448

关键词:

flask-sqlalchemy, sqlalchemy, 分表,分库

大型系统、海量数据肯定涉及到分库分表这些提高效率的手段。由于sqlalchemy的orm思想是一张表对应一个对象,那么当我们有N张相同结构只是表名有区别的分表,sqlalchemy orm怎样处理呢。比如有如下表:

  1. CREATE TABLE `goods_desc_0` (
  2. `goods_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
  3. `goods_desc` text NOT NULL COMMENT '商品详细描述',
  4. PRIMARY KEY (`goods_id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商品信息详情'
  6. CREATE TABLE `goods_desc_1` (
  7. `goods_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
  8. `goods_desc` text NOT NULL COMMENT '商品详细描述',
  9. PRIMARY KEY (`goods_id`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商品信息详情'
  1. class GoodsDesc(db.Model):
  2. __tablename__ = 'goods_desc'
  3. goods_id = db.Column(db.Integer, primary_key=True)
  4. goods_desc = db.Column(db.Text, default=None)
  5. def __str__(self):
  6. return "GoodsDesc => { \
  7. goods_id:%d, goods_desc:'%s'}" % (
  8. self.goods_id, self.goods_desc)
  9. __repr__ = __str__
  10. # 代码示例
  11. goods_id = 101
  12. table_index = goods_id%2
  13. table_name = 'goods_desc_%d' % table_index
  14. GoodsDesc.__table__.name = table_name
  15. gd = GoodsDesc.query.filter(GoodsDesc.goods_id == goods_id).first()
  16. # 这样写虽然也能工作,但是是非常危险的,因为GoodsDesc.__table__是静态全局变量,
  17. # 而且不是web程序request级别的,是app context的,非常不安全。

经过N次Google,终于找到解决方案,而且代码写起来也很优雅。代码如下:

  1. class GoodsDesc(object):
  2. _mapper = {}
  3. @staticmethod
  4. def model(goods_id):
  5. table_index = goods_id%100
  6. class_name = 'GoodsDesc_%d' % table_index
  7. ModelClass = GoodsDesc._mapper.get(class_name, None)
  8. if ModelClass is None:
  9. ModelClass = type(class_name, (db.Model,), {
  10. '__module__' : __name__,
  11. '__name__' : class_name,
  12. '__tablename__' : 'goods_desc_%d' % table_index,
  13. 'goods_id' : db.Column(db.Integer, primary_key=True),
  14. 'goods_desc' : db.Column(db.Text, default=None),
  15. })
  16. GoodsDesc._mapper[class_name] = ModelClass
  17. cls = ModelClass()
  18. cls.goods_id = goods_id
  19. return cls
  20. # 外部代码调用如例如下:
  21. # -----------------------
  22. # 新增插入
  23. gdm = GoodsDesc.model(goods_id)
  24. gdm.goods_desc = 'desc'
  25. db.session.add(gd)
  26. # 查询
  27. gdm = GoodsDesc.model(goods_id)
  28. gd = gdm.query.filter_by(goods_id=goods_id).first()

flask-sqlalchemy分表解决方案的更多相关文章

  1. CRL快速开发框架系列教程十一(大数据分库分表解决方案)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. .Net下你不得不看的分表分库解决方案-多字段分片

    .Net下你不得不看的分表分库解决方案-多字段分片 介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 ...

  3. efcore在Saas系统下多租户零脚本分表分库读写分离解决方案

    efcore在Saas系统下多租户零脚本分表分库读写分离解决方案 ## 介绍 本文ShardinfCore版本x.6.0.20+ 本期主角: - [`ShardingCore`](https://gi ...

  4. mysql分库分表那些事

    为什么使用分库分表? 如下内容,引用自 Sharding Sphere 的文档,写的很大气. <ShardingSphere > 概念 & 功能 > 数据分片> 传统的 ...

  5. “ShardingCore”是如何针对分表下的分页进行优化的

    分表情况下的分页如何优化 首先还是要给自己的开原框架打个广告 sharding-core 针对efcore 2+版本的分表组件,首先我们来快速回顾下目前市面上分表下针对分页常见的集中解决方案 分表解决 ...

  6. efcore使用ShardingCore实现分表分库下的多租户

    efcore使用ShardingCore实现分表分库下的多租户 介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业 ...

  7. .Net分表分库动态化处理

    介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 背景 最近有个小伙伴来问我,分表下他有一批数据,这个 ...

  8. NetCore框架WTM的分表分库实现

    介绍 本期主角: ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 WTM WalkingTec.Mvvm框架(简称W ...

  9. .Net下极限生产力之efcore分表分库全自动化迁移CodeFirst

    .Net下极限生产力之分表分库全自动化Migrations Code-First ## 介绍 本文ShardinfCore版本x.6.x.x+ 本期主角: - [`ShardingCore`](htt ...

随机推荐

  1. css之padding,marging

    padding:内边距,所有浏览器都支持,不允许使用负值 继承内部格式生成了10px的边距. 属性: auto:浏览器计算机内边距. length:规定以具体单位计的内边距值,比如像素.厘米等.默认值 ...

  2. mysql将字符转换成数字

    在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在网上找到的方法记录如下: 1.将字符的数字转成数字,比如'0'转成0可以直接用加法来实现例如:将pony表 ...

  3. 计时器Chronometer和时钟(AnalogClock和DigitalClock)

    计时器Chronometer和时钟(AnalogClock和DigitalClock) (1)Android提供了两个时钟组件:AnalogClock和DigitalClock,DigitalCloc ...

  4. Http状态码301和302概念简单区别

    1.什么是301重定向? 301重定向/跳转一般,表示本网页永久性转移到另一个地址. 301是永久性转移(Permanently Moved),SEO常用的招式,会把旧页面的PR等信息转移到新页面: ...

  5. R提高篇(五): 描述性统计分析

    数据作为信息的载体,要分析数据中包含的主要信息,即要分析数据的主要特征(即数据的数字特征), 对于数据的数字特征, 包含数据的集中位置.分散程度和数据分布,常用统计项目如下: 集中趋势统计量:  均值 ...

  6. 【spring】non-compatible bean definition of same name and class

    org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected excep tion parsing XML do ...

  7. windows下shopex农行支付接口开发笔记

    1.首先是配置Java和tomcat 农行文档里的是linux下的说明.window下我们要按照以下在setclasspath.bat里设置JAVA_HOME,JRE_HOME(红色字体部分).设置这 ...

  8. Ajax请求在IE和Google Chrome中可以响应,在Firefox中无法响应

    在工作中碰到这么一个问题,发送ajax请求,在IE和chrome中可以正常的响应,但是在Firefox中无法响应,代码如下: JS代码: function Sure(obj) { var statu ...

  9. 剑指offer系列62---两个链表的公共结点

    [题目]输入两个链表,找出它们的第一个公共结点. * [思路]1 获取两链表的长度: * 2 让长的链表先走n步后此时走到短链表起始位置: * 3 两链表同时遍历,直至相同,这时返回第一个公共结点. ...

  10. 利用MyEclipse自动创建PO类、hbm文件(映射文件)、DAO

    原文地址:http://blog.csdn.net/fangzhibin4712/article/details/7179414 前提条件:表sjzdfl  表sjzdxx (使用数据库MySQL) ...