多进程,多线程,使用sqlalchemy 创建引擎(单例模式),闭包装饰器承载数据库会话,装饰模型类的类方法
python 多进程,多线程,使用 sqlalchemy 对数据库进行操作
创建引擎 & 获取数据库会话:
使用类的方式,然后在对象方法中去创建数据库引擎(使用单例,确保只创建一个对象,方法里对引擎做判断,确保只创建一个数据库引擎)
# mysql全局基类方法
class MysqlGlobal(object):
__instance = None
__engine = None def __new__(cls, *args, **kwargs):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance def gen_engine(self):
if not MysqlGlobal.__engine:
engine = create_engine("mysql+{driver}://{username}:{password}@{server}/{database}?charset={charset}"
.format(driver=MYSQL_DRIVER,
username=MYSQL_USERNAME,
password=MYSQL_PASSWORD,
server=MYSQL_SERVER,
database=DB_NAME,
charset=DB_CHARSET),
pool_size=100,
max_overflow=100,
# pool_recycle=7200,
pool_recycle=2,
echo=False)
engine.execute("SET NAMES {charset};".format(charset=DB_CHARSET))
MysqlGlobal.__engine = engine
return MysqlGlobal.__engine @property
def mysql_session(self):
self.gen_engine()
mysql_db = sessionmaker(bind=MysqlGlobal.__engine)
return mysql_db()
数据表模型类
# 数据库orm映射绑定引擎
MapBase = declarative_base(bind=MysqlGlobal().gen_engine()) class WfCarInfo(MapBase):
__tablename__ = "wf_carinfo"
untreated_status = 0
treated_status = 1 id = Column(Integer, primary_key=True, nullable=True, autoincrement=True)
status = Column(Integer, nullable=True, default=0) # 接入状态,0:待处理,1:已处理
# create_time = Column(DateTime, nullable=True, default=func.now()) # 记录的创建时间
# update_time = Column(DateTime, nullable=True, default=func.now(), onupdate=func.now()) # 记录的更新时间
。。。省略
数据库会话闭包装饰器
包装了数据库会话 session
def mysql_session(method):
@functools.wraps(method)
def wrapper(*args, **kwargs):
session = MysqlGlobal().mysql_session
return method(*args, session, **kwargs)
return wrapper
装饰器装饰模型类的类方法
这样在外面调用类方法进行数据库操作的时候,就不需要传数据库会话过来(session 参数)
@classmethod
@mysql_session
def query_all(cls, session):
carinfo_obj_list = session.query(cls).all()
info_list = [carinfo_obj.to_dict() for carinfo_obj in carinfo_obj_list]
return info_list @classmethod
@mysql_session
def query_all_by_status(cls, status, session):
carinfo_obj_list = session.query(cls).filter(cls.status == status).all()
info_list = [carinfo_obj.to_dict() for carinfo_obj in carinfo_obj_list]
return info_list @classmethod
@mysql_session
def query_all_by_index(cls, current_index, next_index, session):
carinfo_obj_list = session.query(cls).filter(and_(cls.id > current_index, cls.id <= next_index)).all()
info_list = [carinfo_obj.to_dict() for carinfo_obj in carinfo_obj_list]
return info_list @classmethod
@mysql_session
def insert_one(cls, row, session):
if not row:
return
new_record = cls(**row)
session.add(new_record)
session.commit()
return new_record @classmethod
@mysql_session
def update_status(cls, record_id, status, session):
session.query(cls).filter(cls.recordId == record_id).update({"status": status})
session.commit()
return 1 @classmethod
@mysql_session
def delete_treated_data(cls, session):
# session.query(cls).filter(cls.status == cls.treated_status).delete()
treated_obj_list = session.query(cls).filter(cls.status == cls.treated_status).all()
count = len(treated_obj_list)
[session.delete(treated_obj) for treated_obj in treated_obj_list]
session.commit()
return count
附加(数据库初始化)
# 数据库初始化
def init_db_data():
MapBase.metadata.create_all()
logging.info("init mysql_db success")
print("init mysql_db success")
end ~
多进程,多线程,使用sqlalchemy 创建引擎(单例模式),闭包装饰器承载数据库会话,装饰模型类的类方法的更多相关文章
- Python设计模式 - 创建型 - 单例模式(Singleton) - 十种
对于很多开发人员来说,单例模式算是比较简单常用.也是最早接触的设计模式了,仔细研究起来单例模式似乎又不像看起来那么简单.我们知道单例模式适用于提供全局唯一访问点,频繁需要创建及销毁对象等场合,的确方便 ...
- python函数下篇装饰器和闭包,外加作用域
装饰器和闭包的基础概念 装饰器是一种设计模式能实现代码重用,经常用于查日志,性能测试,事务处理等,抽离函数大量不必的功能. 装饰器:1.装饰器本身是一个函数,用于装饰其它函数:2.功能:增强被装饰函数 ...
- python闭包和装饰器
本文目录: 1. 闭包的解析和用法 2. 函数式装饰器 3. 类装饰器 一.闭包 闭包是一种函数,从形式上来说是函数内部定义(嵌套)函数,实现函数的扩展.在开发过程中,考虑到兼容性和耦合度问题,如果想 ...
- Python之函数的本质、闭包、装饰器
函数名的本质 函数名本质上就是函数的内存地址. 1.可以赋值给其他变量,被引用 def func(): print('in func') f = func print(f) 2.可以被当作容器类型的元 ...
- 闭包&装饰器
闭包 1.函数引用 def test(): print('--test--') # 调用函数 test() # 引用函数 ret = test print(id(ret)) print(id(test ...
- python中对变量的作用域LEGB、闭包、装饰器基本理解
一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...
- 21.python中的闭包和装饰器
python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure). 以下说明主要针对 python ...
- Python闭包装饰器笔记
Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...
- python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)
转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...
随机推荐
- MYSQL双主模式,触发器(trigger)不可见问题
MYSQL版本信息: Your MySQL connection id is 71851 Server version: 5.7.24-log MySQL Community Server (GPL) ...
- python中的raise用法
date ; 2019-08-22 15:10:56 try: s = None if s is None: print("s shi kong de ") raise NameE ...
- [原]error LNK2005:"XXX已经在 XXX.obj 中定义 使用 /FORCE(强制文件输出)暴力解决
参考:https://blog.csdn.net/LG1259156776/article/details/80828720 https://blog.csdn.net/cai18381306175/ ...
- flutter chip标签组件
//一个Material widget. 它可以将一个复杂内容实体展现在一个小块中,如联系人.import 'package:flutter/material.dart'; class ChipDem ...
- ES6深入浅出-12 ES6新增的API(下)-1.录屏
String.includes es5里面判断字符串是否存在的方法 search searcg的厉害之处是可以使用正则 match正则的方式 repeat -1遍,就不合法 startsWith 判断 ...
- DateUtil 提供一些常用的时间想法的方法
package com.opslab.util; import java.text.ParseException;import java.text.SimpleDateFormat;import ja ...
- mysql存储过程中declare 和set 定义变量的区别
declare为对变量进行声明,声明必须制定变量的数据类型,只能写在过程的前面set是对变量赋值,可以放在过程的任何地方对没有declare声明过的变量赋值,该变量必须以加上@号,否则会报错 DECL ...
- linq list select用法注意事项
下面是我自己做的一个例子 List<CR_CustomerOrder> OrdList = new List<CR_CustomerOrder>(); var b = OrdL ...
- 原生JavaScript常用本地浏览器存储方法二(cookie)
JavsScript Cookie概述 cookie是浏览器提供的一种机制,它将document对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是Jav ...
- 基于libuv的TCP设计(二)
一.本人设想的TCP服务器有如下特性: 1.启动服务,一直监听端口. 2.有新连接(客户端)就通知用户.并把连接接收到的数据回调给用户. 3.客户端连接上后用户可在任意时间发送数据给它. 4.客户端断 ...