sqlalchemy按月水平分表、python元类、动态映射表名 模型类

SQLAlchemy==1.3.8
python==3.7

1.事先按月建表
  • 根据sqlalchemy 模型类建表
from sqlalchemy.ext.declarative import declarative_base,
from sqlalchemy import Column, String
from sqlalchemy import create_engine, MetaDataurl = f"""mysql+pymysql://{user}:{password}@{host}:{port}/{db}?charset={charset}"""
engine = create_engine(url, pool_size=5, pool_recycle=1800, pool_pre_ping=True, encoding='utf-8')
Base = declarative_base(engine)class TestTable(Base):__tablename__ = 'test_table'id = Column(Integer, primary_key=True)table_name = Column(String(50), unique=True)def create_sharding_table(index=None):new_class = type(f"MyClass_{index}", (Base,), dict(__tablename__=f"test_table_{index}", id=Column(Integer, primary_key=True)))return new_classdef create_table():# 用元类创建多个model classmy_class_list = [create_more_tables(x) for x in range(12)]Base.metadata.create_all()if __name__ == '__main__':create_table()
2.根据DB中已有的表 映射模型类
  • 方式1:sqlalchemy 的automap_base映射
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.ext.declarative.api import DeclarativeMeta
from sqlalchemy import create_engine, MetaDataurl = f"""mysql+pymysql://{user}:{password}@{host}:{port}/{db}?charset={charset}"""
engine = create_engine(url, pool_size=5, pool_recycle=1800, pool_pre_ping=True, encoding='utf-8')def to_dict(self):return {c.name: getattr(self, c.name) for c in self.__table__.columns}class DbSharding(object):def __init__(self, map_tables=None):"""映射db模型:param map_tables: list 默认无参数, 映射库里的所有表。如果tables有参数, 则只映射指定表"""self.tables = map_tablesif not map_tables:self.auto_base = automap_base()self.auto_base.prepare(engine, reflect=True)else:self.metadata = MetaData()self.metadata.reflect(engine, only=map_tables)self.auto_base = automap_base(metadata=self.metadata)self.auto_base.prepare()def get_model(self, table_name):"""根据数据库已存在的表名动态映射模型类:param table_name: str:return:"""if not table_name:return Nonetry:model: DeclarativeMeta = getattr(self.auto_base.classes, table_name)model.to_dict = to_dictreturn modelexcept AttributeError:logger.error(f"table '{table_name}' not exist")raiseif __name__ == '__main__':db = DbSharding()model = db.get_model("test_table_1")# print(model.to_dict())res = session.query(model).filter(model.id == 1).one()print(res.month)res_dict = res.to_dict()print(res_dict)session.close()
  • 方式2:元编程动态生成表名对应的模型类
class TestTable(object):_mapper = {}@staticmethoddef model(month):table_name = f"test_table_{str(month)}"class_name = f"TestTable_{str(month)}"ModelClass = TestTable._mapper.get(class_name)if ModelClass is None:ModelClass = type(class_name,(Base,),dict(__tablename__=table_name,__module__=__name__,__name__=class_name,id=Column(Integer, primary_key=True),month=Column(Integer)))TestTable._mapper[class_name] = ModelClass# cls = ModelClass()# return clsreturn ModelClassif __name__ == '__main__':TestTableClass= TestTable.model(1)res = session.query(TestTableClass).filter(TestTableClass.id == 1)print(res)
3.代码里相应查询插入修改,先根据月份获取对应模型类

sqlalchemy按月水平分表、python元类、动态映射表名automap_base\ 模型类相关推荐

  1. MyCat分布式数据库集群架构工作笔记0021---高可用_单表存储千万级_海量存储_水平分表全局表

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们说现在咱们已经实现了水平分表,ER表,但是现在还有一个问题 下面这个 字典表,因为字典表放 ...

  2. 2、ShardingSphere 之 Sharding-JDBC实现水平分表

    文章目录 1 Sharding-JDBC简介 2 Sharding-JDBC 3 Sharding-JDBC实现水平分表 3.1 搭建环境 3.1.1 总体概览 3.1.2 创建SpringBoot工 ...

  3. mysql使用MRG_MyISAM(MERGE)实现水平分表

    来源:http://m.oschina.net/blog/382658 在MySql中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基 ...

  4. Mysql水平分表-后端代码

    思路 依据入参进行选择表 把参数写入到sql语句中,即可选择保存至那个表或者查询那个表 SQL CREATE TABLE `msg_0` (`id` int(11) NOT NULL AUTO_INC ...

  5. Mysql 数据库水平分表 存储过程

    数据库存储量达到一定程度的时候,就需要进行分表以减轻检索的消耗. 常用的分表方式包括水平和垂直分表.本次进行的是按照uid进行水平分表. ##分表思路: 水平分表平均的将数据按照特定方式分配到多个表中 ...

  6. ShardingSphere(二) 水平分表配置搭建,实现分表写入读取

    概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...

  7. Sharding-JDBC水平分表(分片策略)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记008

    上一节我们实现了,水平分表的,环境的搭建,做了一个项目springboot的,然后创建了数据库,然后我们再去做 我们去配置sharding-jdbc的分片策略去. 我们可以去官网,点击了解更多 然后我 ...

  8. Sharding-JDBC水平分表(环境搭建)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记007

    上面我说了sharding-jdbc的介绍,然后下面我们来做一下 用sharding-jdbc的水平分表. 我们用到了上面的技术. 首先我们去创建工程 点击next

  9. Sharding-Sphere,Sharding-JDBC_分库分表(水平分库_水平分表)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记004

    然后我们前面说了垂直分库,分表,我们要了解什么是垂直分库分表 1.垂直分表,就是比如,我们有个课程的表,但是我们数据量太大的话,我们把这个课程表,可以分成 课程基本信息表,课程描述表,这两个表,这样的 ...

  10. 使用sharding-jdbc实现水平分库+水平分表

    前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,逻辑上为同一张表,分 ...

最新文章

  1. .NET中的文件IO操作实例
  2. NET 2005 中通过TryParse来检验和转换数据类型。
  3. java setlocation_Java Point.setLocation方法代碼示例
  4. php获取jsp的session的值,在JSP或Servlet中获取session数量
  5. 一行代码添加P值的可视化技巧分享~~
  6. Linux Shell编程(3)——运行shell脚本
  7. IPv6的地址表达形式
  8. smith圆图重要性_数学之美:浅谈Smith圆图
  9. 超细节!数据分析社招面试指南
  10. 114-select(基础)
  11. JavaWeb网上书城项目
  12. 计算机网络连接限制,网络受限制或无连接怎么办?电脑网络连接受限制或无连接问题...
  13. Mongoose Populate
  14. 实体门店的促销活动该如何策划才能成功?
  15. 安装笔记本内存条及认识内存插槽
  16. 100+大屏模板免费领!葡萄城BI行业应用方案重磅发布!
  17. iOS 最新版9.3 disk image
  18. oracle中update语句更新字段
  19. java preferences设置_Java利用Preferences设置个人偏好
  20. 会计----会计凭证

热门文章

  1. 3月22 坐标系转换,旋转矩阵,仿射变换,例子,相机与世界,欧拉角与轴角公式,一个坐标系下面的轨迹
  2. MkDocs安装、生成文档、风格配置、插件安装
  3. tensorflow功能函数
  4. 四、矩阵特征值与特征向量的计算
  5. • 服务注册与发现(Eureka、Consul)
  6. 我的凸优化学习之路(转)
  7. 凸优化有关的数值线性代数知识二:求解已经因式分解的矩阵的线性方程组
  8. Python---装饰器
  9. 【cluvfy】集群验证工具cluvfy使用方法——stage
  10. perl发送天气预报