十五 .Flask SQLAlchemy 使用

一 . SQLAlchemy 基本使用

1.SQLAlchemy 介绍

pip3 install sqlalchemy

SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,
简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
Engine,框架的引擎
Connection Pooling ,数据库连接池
Dialect,选择连接数据库的DB API种类
Schema/Types,架构和类型
SQL Exprression Language,SQL表达式语言

2. SQLAlchemy 使用单表常用操作

models.py

import
datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index Base = declarative_base() # https://www.cnblogs.com/wupeiqi/articles/8259356.html class Users(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(32), index=True, nullable=False) dep_id=Column(Integer, index=True) def create_all(): """ 根据类创建数据库表 :return: """ engine = create_engine( "mysql+pymysql://root:root@localhost:3306/mydb2?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) Base.metadata.create_all(engine) def drop_all(): """ 根据类删除数据库表 :return: """ engine = create_engine( "mysql+pymysql://root:root@localhost:3306/mydb2?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建的连接 pool_size=5, # 连接池大小 pool_timeout=30, # 池中没有线程最多等待的时间,否则报错 pool_recycle=-1 # 多久之后对线程池中的线程进行一次连接的回收(重置) ) Base.metadata.drop_all(engine) if __name__ == '__main__': create_all() # drop_all()
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import Users


engine = create_engine(
       "mysql+pymysql://root:root@localhost:3306/mydb2?charset=utf8",
        max_overflow=0,  # 超过连接池大小外最多创建的连接
        pool_size=5,  # 连接池大小
        pool_timeout=30,  # 池中没有线程最多等待的时间,否则报错
        pool_recycle=-1  # 多久之后对线程池中的线程进行一次连接的回收(重置)
    )
SessionFactory = sessionmaker(bind=engine)
# 根据Users类对users表进行增删改查
session = SessionFactory()

# ======================增=============================
# # 单条数据
obj=Users(name="张三")
session.add(obj)
session.commit()


# 多条数据
session.add_all([
          Users(name="张里"),
          Users(name="马上")
])
session.commit()


# ======================查=============================
# for集合查询
aa=session.query(Users).all()
for row in  aa:
    print(row.name,row.id)

# # 条件查询
bb=session.query(Users).filter(Users.id>=3)
for roe in  bb:
    print(roe.name)

# # 条件查询
res=session.query(Users).filter(Users.id>=2).first()
print(res)


# ======================删=============================
session.query(Users).filter(Users.id>2).delete()
session.commit()


# ======================改=============================
session.query(Users).filter(Users.id==1).update({Users.name:"哈哈哈哈"})
session.query(Users).filter(Users.id==2).update({"name":"哈哈哈哈哈哈哈哈哈哈企鹅恶趣味去"})
session.query(Users).filter(Users.id == 4).update({'name':Users.name+"DSB"},synchronize_session=False)  # 在原来的数据上进行追加
session.commit()







# ======================其他常用=============================

# 1. 指定列
select id,name as cname from users;
result = session.query(Users.id,Users.name.label('cname')).all()
for item in result:
        print(item,item.id,item.cname)

aa=session.query(Users.id,Users.name.label('cname'))
print(aa) 查看sql语句



# 2. 默认条件and
aa=session.query(Users).filter(Users.id > 1, Users.name == '李四').all()
for i in aa:
    print(i.name)



# 3. between  在什么之间
aa=session.query(Users).filter(Users.id.between(4, 7), Users.name == '李四').all()
for i in aa:
    print(i.name)




#  in  包含
aa=session.query(Users).filter(Users.id.in_([1,5,2])).all() #在这个范围内 查询的结构顺序会乱
for i in aa:
    print(i.name)

print("--------------------------")
cc=session.query(Users).filter(~Users.id.in_([1,3,4])).all()  # ~不在这个范围内
for i in cc:
    print(i.name)





# 5. 子查询
aa=session.query(Users).filter(Users.id.in_(session.query(Users.id).filter(Users.name=='李四'))).all()
for i in  aa:
    print(i.name)



# 6. and 和 or
from sqlalchemy import and_, or_

aa=session.query(Users).filter(Users.id > 3, Users.name == '李四').all()      # 默认就是and
for i in aa:
    print(i.name)

bb=session.query(Users).filter(and_(Users.id > 3, Users.name == '马上')).all()     #and  #id大于3 并且name=马上
for i in bb:
    print(i.name)

cc=session.query(Users).filter(or_(Users.id < 2, Users.name == '黄色')).all()                             #  or_(Users.id < 2, Users.name == '黄色')表示id小于2 或者name等于黄色
for i in cc:
    print(i.name)

dd=session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == 'eric', Users.id > 3),
        Users.extra != ""
    )).all()


for i in dd:
    print(i.name)




# 7. filter_by
aa=session.query(Users).filter_by(name='李四').all()
print(aa)
for i in aa:
    print(i.name)



# 8. 通配符
ret1 = session.query(Users).filter(Users.name.like('李%')).all()
for i in ret1:
    print(i.name)

ret = session.query(Users).filter(~Users.name.like('黄%')).all()
for i in ret:
    print(i.name)



# 9. 切片
result = session.query(Users)[1:3]   切片 (限制/分页)
print(result)
for i in result:
    print(i.name)



# 10.排序
ret1 = session.query(Users).order_by(Users.name.desc()).all()   #升序
for i in ret1:
    print(i.name)
print("-----------------")
ret2= session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()  # 降序
for i in ret2:
    print(i.name)



# 11. group by
from sqlalchemy.sql import func   # 导入 func,func 中有聚合函数

ret = session.query(
        Users.dep_id,
        func.count(Users.id),
).group_by(Users.dep_id).all()
for item in ret:
        print(item)       # group_by(字段)之后不要 query() 所有字段

print("-----------------------------------------------------")
ret = session.query(
        Users.dep_id,
        func.count(Users.id),
).group_by(Users.dep_id).having(func.count(Users.id) >=2).all() 根据 name 分组,func.count(Users.id) > 2 ;根据聚合函数进行二次筛选:having
for item in ret:
        print(item)




# 12.union 和 union all            组合(垂直/上下连表):union 和 union all --- union all 去重,union 不去重
# Union All:对两个结果集进行并集操作,包括重复行,不进行排序
# Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

# 有关union和union all关键字需要注意的问题是:
# union 和 union all都可以将多个结果集合并,而不仅仅是两个,你可以将多个结果集串起来。
# 使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。但列名则不一定需
#  union 和 union_all 的区别
#        union 去重
#         union_all 不去重
# 相同点:合并的两张表的列要相同
"""
select id,name from users
UNION
select id,name from users;
"""
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()
print(ret)

q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()
print(ret)
session.close()

猜你喜欢

转载自www.cnblogs.com/lovershowtime/p/11756891.html