首先明确一个概念,SQLAlchemy通过Model.query方法对数据进行查询,Model.query是db.session.query(Model)的简写。即以下是等价的:
# User是Model
User.query.all()
db.session.query(User).all()
查询
简单查询
# 通过get()查询主键为9的user
db.session.query(User).get(9)
# 通过filter()指定字段查询年龄为22的user
db.session.query(User).filter(User.age == 22).first()
# 通过filter()指定字段查询年龄为22和account为test5的user
db.session.query(User).filter(User.age == 22, User.account == "test5").first()
# 通过filter_by()指定字段查询年龄为22的user
db.session.query(User).filter_by(age=22).all()
# 通过filter_by()指定字段查询年龄为22和account为test5的user
db.session.query(User).filter_by(age=22, account="test5").all()
其中,filter与filter的区别如下:
| 方法 | 语法 | >、<查询 | and_和or_查询 |
|---|---|---|---|
| filter() | 类名.属性名 用== | 支持 | 支持 |
| filter_by() | 属性名 用= | 不支持 | 不支持 |
查询结果处理
# 所有的结果都会加载到内存中。它返回的是一个列表,如果查询不到任何结果,返回的是空列表。
db.session.query(User).filter(User.age == 22).all()
# first() 返回查询到的第一个结果,如果没有查询到结果,返回None。
db.session.query(User).filter(User.age == 23).first()
# one() 如果只能查询到一个结果,返回它,否则抛出异常。没有结果抛出sqlalchemy.orm.exc.NoResultFound,
# 有超过一个结果时抛出sqlalchemy.orm.exc.MultipleResultsFound。
db.session.query(User).filter(User.age == 20).one()
# one_or_none()比起one()来,区别只是查询不到任何结果时不再抛出异常而是返回None。
db.session.query(User).filter(User.age == 23).one_or_none()
# scalar() 这个方法与.one_or_none()的效果一样。 如果查询到很多结果,抛出sqlalchemy.orm.exc.MultipleResultsFound异常。
# 如果只有一个结果,返回它,没有结果返回None。
db.session.query(User).filter(User.age == 23).scalar()
# 返回记录条数
db.session.query(User).filter(User.age >= 20).count()
# 限制返回条数
db.session.query(User).filter(User.age >= 20).limit(10).all()
# 过滤掉重复记录,
db.session.query(User).filter(User.age >= 20).distinct(User.password).all()
查询条件
# 与
db.session.query(User).filter(User.age >= 22, User.password == "123456").all()
# and与上面这种方式结果一样
db.session.query(User).filter(and_(User.age >= 22, User.password == "123456")).all()
# 或
db.session.query(User).filter(or_(User.age >= 23, User.password == "123456")).all()
# or与and并存
db.session.query(User).filter(or_(User.age > 24, User.age < 20), User.password == "123456").all()
db.session.query(User).filter(or_(User.password == "123456", and_(User.age < 20, User.gender == "1"))).all()
# in
user6 = db.session.query(User).filter(User.age.in_([22, 19, 27])).all()
print(user6)
# not in
user7 = db.session.query(User).filter(~User.age.in_([22, 19, 27])).all()
print(user7)
# like
user8 = db.session.query(User).filter(User.name.like('小%')).all()
print(str(user8) + "----------------------------------")
# contains
user9 = db.session.query(User).filter(User.name.contains('小')).all()
print(user9)
# 查询指定列
user10 = db.session.query(User.name, User.password, User.age, User.gneder).all()
print(user10)
# 使用列表给filter方法传参
conditions = list()
conditions.append(User.name.like('%李%'))
conditions.append(User.age < 28)
user11 = db.session.query(User).filter(*conditions).all()
print(user11)
# 使用字典给filter_by方法传参
condition_dict = dict()
condition_dict['name'] = '小李'
condition_dict['age'] = 27
user12 = db.session.query(User).filter_by(**condition_dict).all()
print(user12)
return success(message="这是一条测试!")