执行原生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的;
'''