One - One Code All

Blog Content

Python数据库ORM框架之SQLAlchemy

Python   2015-12-14 22:03:41

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

'''



上一篇:python中pandas的DataFrame某列最大值所在行
下一篇:数据库连接池SQLAlchemy+mysql的使用

The minute you think of giving up, think of the reason why you held on so long.