sqlalchemy按月水平分表、python元类、动态映射表名automap_base\ 模型类
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\ 模型类相关推荐
- MyCat分布式数据库集群架构工作笔记0021---高可用_单表存储千万级_海量存储_水平分表全局表
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后咱们说现在咱们已经实现了水平分表,ER表,但是现在还有一个问题 下面这个 字典表,因为字典表放 ...
- 2、ShardingSphere 之 Sharding-JDBC实现水平分表
文章目录 1 Sharding-JDBC简介 2 Sharding-JDBC 3 Sharding-JDBC实现水平分表 3.1 搭建环境 3.1.1 总体概览 3.1.2 创建SpringBoot工 ...
- mysql使用MRG_MyISAM(MERGE)实现水平分表
来源:http://m.oschina.net/blog/382658 在MySql中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基 ...
- Mysql水平分表-后端代码
思路 依据入参进行选择表 把参数写入到sql语句中,即可选择保存至那个表或者查询那个表 SQL CREATE TABLE `msg_0` (`id` int(11) NOT NULL AUTO_INC ...
- Mysql 数据库水平分表 存储过程
数据库存储量达到一定程度的时候,就需要进行分表以减轻检索的消耗. 常用的分表方式包括水平和垂直分表.本次进行的是按照uid进行水平分表. ##分表思路: 水平分表平均的将数据按照特定方式分配到多个表中 ...
- ShardingSphere(二) 水平分表配置搭建,实现分表写入读取
概述:本章内容分将搭建一个ShardingSphere工程环境,并实现最简单的单库下的水平分表配置演示.通过解读配置文件我们来了解ShardingSphere中是如何实现他的路由操作. 环境:Spri ...
- Sharding-JDBC水平分表(分片策略)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记008
上一节我们实现了,水平分表的,环境的搭建,做了一个项目springboot的,然后创建了数据库,然后我们再去做 我们去配置sharding-jdbc的分片策略去. 我们可以去官网,点击了解更多 然后我 ...
- Sharding-JDBC水平分表(环境搭建)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记007
上面我说了sharding-jdbc的介绍,然后下面我们来做一下 用sharding-jdbc的水平分表. 我们用到了上面的技术. 首先我们去创建工程 点击next
- Sharding-Sphere,Sharding-JDBC_分库分表(水平分库_水平分表)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记004
然后我们前面说了垂直分库,分表,我们要了解什么是垂直分库分表 1.垂直分表,就是比如,我们有个课程的表,但是我们数据量太大的话,我们把这个课程表,可以分成 课程基本信息表,课程描述表,这两个表,这样的 ...
- 使用sharding-jdbc实现水平分库+水平分表
前面的文章使用sharding-jdbc实现水平分表中详细记录了如何使用sharding-jdbc实现水平分表,即根据相应的策略,将一部分数据存入到表1中,一部分数据存入到表2中,逻辑上为同一张表,分 ...
最新文章
- .NET中的文件IO操作实例
- NET 2005 中通过TryParse来检验和转换数据类型。
- java setlocation_Java Point.setLocation方法代碼示例
- php获取jsp的session的值,在JSP或Servlet中获取session数量
- 一行代码添加P值的可视化技巧分享~~
- Linux Shell编程(3)——运行shell脚本
- IPv6的地址表达形式
- smith圆图重要性_数学之美:浅谈Smith圆图
- 超细节!数据分析社招面试指南
- 114-select(基础)
- JavaWeb网上书城项目
- 计算机网络连接限制,网络受限制或无连接怎么办?电脑网络连接受限制或无连接问题...
- Mongoose Populate
- 实体门店的促销活动该如何策划才能成功?
- 安装笔记本内存条及认识内存插槽
- 100+大屏模板免费领!葡萄城BI行业应用方案重磅发布!
- iOS 最新版9.3 disk image
- oracle中update语句更新字段
- java preferences设置_Java利用Preferences设置个人偏好
- 会计----会计凭证