首先明確一個概念,SQLAlchemy通過Model.query方法對數(shù)據(jù)進行查詢,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的區(qū)別如下:
| 方法 | 語法 | >、<查詢 | and_和or_查詢 |
|---|---|---|---|
| filter() | 類名.屬性名 用== | 支持 | 支持 |
| filter_by() | 屬性名 用= | 不支持 | 不支持 |
查詢結(jié)果處理
# 所有的結(jié)果都會加載到內(nèi)存中。它返回的是一個列表,如果查詢不到任何結(jié)果,返回的是空列表。
db.session.query(User).filter(User.age == 22).all()
# first() 返回查詢到的第一個結(jié)果,如果沒有查詢到結(jié)果,返回None。
db.session.query(User).filter(User.age == 23).first()
# one() 如果只能查詢到一個結(jié)果,返回它,否則拋出異常。沒有結(jié)果拋出sqlalchemy.orm.exc.NoResultFound,
# 有超過一個結(jié)果時拋出sqlalchemy.orm.exc.MultipleResultsFound。
db.session.query(User).filter(User.age == 20).one()
# one_or_none()比起one()來,區(qū)別只是查詢不到任何結(jié)果時不再拋出異常而是返回None。
db.session.query(User).filter(User.age == 23).one_or_none()
# scalar() 這個方法與.one_or_none()的效果一樣。 如果查詢到很多結(jié)果,拋出sqlalchemy.orm.exc.MultipleResultsFound異常。
# 如果只有一個結(jié)果,返回它,沒有結(jié)果返回None。
db.session.query(User).filter(User.age == 23).scalar()
# 返回記錄條數(shù)
db.session.query(User).filter(User.age >= 20).count()
# 限制返回條數(shù)
db.session.query(User).filter(User.age >= 20).limit(10).all()
# 過濾掉重復(fù)記錄,
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與上面這種方式結(jié)果一樣
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="這是一條測試!")