SQLAlchemy與數(shù)據(jù)庫交互

首先明確一個概念,SQLAlchemy通過Model.query方法對數(shù)據(jù)進行查詢,Model.querydb.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="這是一條測試!")
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容