执行原生sql
单线程操作池
import time import threading import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.engine.base import Engine conn_pool=create_engine( #创建sqlalchemy引擎 "mysql+pymysql://webproject:web@192.168.1.18:3306/web?charset=utf8", max_overflow=2, #超过连接池大小之后,允许最大扩展连接数; pool_size=5, #连接池大小 pool_timeout=30,#连接池如果没有连接了,最长等待时间 pool_recycle=-1,#多久之后对连接池中连接进行一次回收 ) #单线程操作线程池 conn = conn_pool.raw_connection() #从连接池中获取1个连接,开始连接 cursor = conn.cursor() cursor.execute( "select * from cmdb_worker_order" ) result = cursor.fetchall() print(result) cursor.close() conn.close()
多线程操作池
import time import threading import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.engine.base import Engine conn_pool=create_engine( #创建sqlalchemy引擎 "mysql+pymysql://webproject:web@192.168.1.18:3306/web?charset=utf8", max_overflow=2, #超过连接池大小之后,允许最大扩展连接数; pool_size=5, #连接池大小 pool_timeout=30,#连接池如果没有连接了,最长等待时间 pool_recycle=-1,#多久之后对连接池中连接进行一次回收 ) #多线程操作线程池 def task(arg): conn = conn_pool.raw_connection() cursor = conn.cursor() cursor.execute( #"select * from cmdb_worker_order" "select sleep(2)" ) result = cursor.fetchall() cursor.close() conn.close() for i in range(20): t = threading.Thread(target=task, args=(i,)) #5个线程 执行2秒 然后5个线程在去执行2秒 t.start()
基础操作,增删改查
无论SQLalchemy的增、删、改、查操作,最后都需要commit,数据库才会执行SQL; from SqlALchemy.models import Users from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine engine = create_engine( "mysql+pymysql://webproject:web@192.168.1.18:3306/web?charset=utf8") Session = sessionmaker(bind=engine) # 每次执行数据库操作时,都需要创建一个会话 session = Session() # ############# 执行ORM操作 ############# obj1 = Users(name="张根") #创建Users对象=1行数据 session.add(obj1) #添加到表中 # 提交事务 session.commit() # 关闭session session.close() # 增 obj1 = Users(name="张根",age=18,email='13220198866@163.com',extra='sss') session.add(obj1) # 增 session.add_all([ Users(name="张根1",age=19,email='645172205@qq.com',extra='sss'), Users(name="张根2",age=20,email='13220198866@139.com',extra='sss') ]) # 删 session.query(Users).filter(Users.id==5).delete() # 改 ###################修改########################## session.query(Users).filter(Users.id==4).update({'name':'Martin'}) session.query(Users).filter(Users.id==4).update({Users.name: Users.name + "666"}, synchronize_session=False)#在原来的基础上做字符串 session.query(Users).filter(Users.id==18).update({Users.id: Users.id - 12},synchronize_session="evaluate")#在原来的基础上做数字+,-操作 # 查 r0=session.query(Users).all() #查询user表中全部数据; r1=session.query(Users).filter(Users.id > 2) #查询user表中,id>2的记录; r2=session.query(Users.age).all() #查询User表中的 age列; ##[(18,), (19,)] r3=session.query(Users.age.label('cname')).all() #使用别名查询 r4=session.query(Users).filter(Users.name=='Martin').all() #查询姓名==Martin的用户 r5=session.query(Users).filter_by(name='Martin',age=19).all() #filter_by方式查询 r6=session.query(Users).filter_by(name='Martin',age=19).first() #获取第 单个对象 print(r6.name) r7=session.query(Users).filter(text("id<:value and name=:name")).params(value=18, name='Martin').order_by(Users.id).all() #查询 id>18 name=Martin的Users 根据 id排序,params支持传参数; r8 = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all()#from_statement,申请使用原生sql # 查 #条件查询 ret0 = session.query(Users).filter(Users.id.between(0,7), Users.name == 'Martin').all() # #between: 查询 user id在0--7之间,用户名为Martin 的数据; ret1= session.query(Users).filter(Users.id.in_([1,6])).all() #查询user_id in [1,6] 的数据 ret2 = session.query(Users).filter(~Users.id.in_([1,3,4])).all() #查询user_id not in [1,6] 的数据 ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='Martin'))).all() #1.session.query(Users.id).filter_by(name='Martin') 查询name=Martin'的id #2.在user表中 按1的结果 查询 # 查 ###################################字符串符 模糊匹配查询############################### ret0 = session.query(Users).filter(Users.name.like('M%')).first().name ret1 = session.query(Users).filter(~Users.name.like('%r%')).first().name print(ret0,ret1) ##########################排序############################## ret0 = session.query(Users).order_by(Users.id.desc()).all() #根据id,由大到小排序(desc). ret1 = session.query(Users).order_by(Users.id.asc(),Users.age.desc()).all() #根据id,由小到大排序(asc),如id相等,由大到小排序(desc). print([i.id for i in ret0 ] ) print([i.id for i in ret1 ] ) ################################分组############################### from sqlalchemy.sql import func ret0 = session.query(Users).group_by(Users.age).all() #根据name字段进行分组 ret1 = session.query( #使用name字段进行分组,求每组中 最大id 、最小id 、id 之和 func.max(Users.id), func.sum(Users.id), func.min(Users.id)) .group_by(Users.name).all() ret2 = session.query( func.max(Users.id), func.sum(Users.id), #对分组之后的数据进行 having筛选, func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all() ''' having的作用: 例如:查询公司中 部门人数大于3人的部门,先按照部门分组,然后求人数,然后再having 大于3的; '''