sqlalchemy查询语句总结
查询
1.FLASK-SQLALCHEMY - 查询
1.基于 db.session 进行查询
1.db.session.query()
该函数会返回一个Query对象,类型为 BaseQuery,包含了指定实体类对应的表中所有的数据
该函数也可以接受多个参数,参数表示的是要查询哪个实体
2.查询执行函数
目的:在查询的基础上得到最终想要的结果
语法:db.session.query(...).查询执行函数()
也可以直接使用定义的类来查询:
例:Users.query.all()
Users.query.first()
。。。。。
函数 说明
all() 以列表的方式返回查询的所有结果
first() 返回查询中的第一个结果,如果没有结果,则返回None
first_or_404() 返回查询中的第一个结果,如果没有结果,则终止并返回404
count() 返回查询结果的数量
get() 根据主键获取到对象,
3.查询过滤器函数
作用:在查询的基础上,筛选部分列出来
语法:db.session.query(..).过滤器函数().查询执行函数()
过滤器函数:
函数 说明
filter() 按指定条件进行过滤(多表,单表,定值,不定值..)
filter_by() 按等值条件进行过滤
limit() 按限制行数获取
order_by() 根据指定条件进行排序
group_by() 根据指定条件进行分组
offset() 跳过几条开始查,例:db.session.query.offset(2).all() #跳过前两条,开始查
db.session.query.offset(1).limit(2).all() # 跳过一条,取出两条数据
User.query.order_by(User.id.desc()).all() # 按照id进行降序的方式,查出,默认升序,函数asc()
详解:
1.filter()
1. 查询年龄 大于 30 的Users 的信息
db.session.query(Users).filter(Users.age>30).all()
注意:条件必须由 模型类.属性 来组成
2.查询年龄 大于 30 且 id 大于5 的Users的信息
db.session.query(Users).filter(Users.age>30,Users.id > 5).all()
3.查询年龄大于30 或者 id大于5 的Users的信息
注意:查询 或 的操作,要借助 or_(),
or_() 函数需要导入 from sqlalchemy import or_
db.session.query(Users).filter(or_(条件1,条件2)).all()
4.查询id等于5的Users的信息
注意:等值判断必须使用 ==
db.session.query(Users).filter(Users.id==5).first()
5.查询 email 中包含 'w' 的users的信息 - 模糊查询 like
db.session.query(Users).filter(Users.email.like('%w%')).all()
6.查询 id 在 [1,2,3] 之间的 Users 的信息
db.session.query(Users).filter(Users.id.in_([1,2,3])).all()
2.filter_by()
1.查询 id=5的Users的信息
db.session.query(Users).filter_by(id=5).first()
-
写入多个条件:
db.session.query(Users).filter_by(id=5,name=“wht”).first()3.limit() 1.在整个查询结果中获取前5条数据 db.session.query(Users).limit(5).all()
db.session.query(Users).limit(5).all()
db.session.query(Users).limit(3).offset(1).all()
offset() 表示行数偏移量,这里就是从多少开始查询4.order_by() 1.对Users表中所有的数据按id倒序排序 db.session.query(Users).order_by('id desc').all()
desc 表示倒序,默认为升序
倒序:从大到小
若指定的字段中有重复的,还可以指定二级排序
db.session.query(Users).order_by(‘id desc,age asc’).all()
按照id倒序排列,年龄升序排列db.session.query(Users).order_by(Users.id.desc()).all()
注意:新版本5.group_by() 按照年龄进行分组 db.session.query(Users.age).group_by('age').all() from sqlalchemy import func db.session.query(Users.age,func.count(Users.age)).group_by(Users.age).all() # 按照年龄进行分组,得出每个年龄的人数 # func中有很多数学上的函数
查询语句
print(session.query(User).get({'id': 1})) # 根据id获取一条数据
print(session.query(User).filter(User.id == 1).one()) # 查询符合条件的任何一条记录
print(session.query(User).filter(User.id == 1).first()) # 查询返回的第一条记录
print(session.query(User).filter_by(id=1).all()) # 查询返回符合条件的左右记录
print(session.query(User).filter(User.id == 1).first().user_name) # 如果未查询到数据,则会抛出异常
print(session.query(User).filter_by(user_name='test2').limit(2).all()) # 限制最多返回2条记录
print(session.query(User).filter_by(user_name='test2').offset(1).all()) # 从查询到的第二条记录开始返回
print(session.query(User).filter(or_(User.id == 1, User.id == 2)).all()) # or_多条件查询
print(session.query(User).filter(User.id.in_((1, 2))).all()) # in多条件查询
print(session.query(User).filter(not_(User.id == 1)).all()) # not_非条件过滤
print(session.query(func.count('*')).select_from(User).scalar()) # 使用查询传递函数统计
print(session.query(func.count(User.id)).scalar()) # 使用查询传递函数统计
print(session.query(User).filter(User.user_name.like('%xx%'))) # 模糊匹配查询
print(session.query(User).filter(User.id == 1).scalar().user_name) # 如果有记录,返回第一条记录的第一个元素
# 排序
all_users = session.query(User).order_by('user_name').all() # 根据user_name排序
all_users = session.query(User).order_by(User.user_password).all() # 根据user_password排序
all_users = session.query(User).order_by(User.user_password.desc()).all() # 根据user_password降序排序
all_users = session.query(User).order_by(User.user_name, User.user_password).all() # user_name升序,user_password降序排序
# 连接
print(session.query(User).join(Admin, User.id == Admin.id).filter().all()) # 内连接,如果没有外键的话,也可以手动指定关联外键
print(session.query(User).outerjoin(Admin).filter().all()) # 左外连接,此处Admin必须有字段为User的外键
# 插入sql语句进行查询
session.query(User).filter(text("id<:value and name=:name")).\
... params(value=224, name='fred').order_by(User.id).one()
# contains() 模糊查询,查询的数据中包含west字符串
emps = session.query(EmpMaster).filter(EmpMaster.EMAIL.contains('west')).all()
# having是对查找结果进一步过滤。比如只想要看未成年人的数量,那么可以首先对年龄进行分组统计人数,然后再对分组进行having过滤。
result = session.query(User.age,func.count(User.id)).group_by(User.age).having(User.age >= 18).all()
查询名字结尾字符为g的所有数据[开始/包含]
User.query.filter(User.name.endswith('g')).all()
User.query.filter(User.name.startswith('g')).all()
User.query.filter(User.name.contains('g')).all()
data=db.session.query(wei_pin_hui_1.shi_yong_ren_qun,wei_pin_hui_1.feng_ge,func.count(wei_pin_hui_1.feng_ge)).filter(or_(wei_pin_hui_1.shi_yong_ren_qun.contains('青年'),wei_pin_hui_1.shi_yong_ren_qun.contains('青少年'))).group_by(wei_pin_hui_1.shi_yong_ren_qun).group_by(wei_pin_hui_1.feng_ge).all()
print(data)
python_flask_ORM
SQLAlchemy ORM查询常见筛选条件的表示方法
https://haofly.net/sqlalchemy/