日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLAlchemy中filter_by()和filter()的用法不同

發(fā)布時(shí)間:2023/12/20 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLAlchemy中filter_by()和filter()的用法不同 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

filter_by() 和 filter() 的最主要的區(qū)別:

模塊語法><(大于和小于)查詢and_和or_查詢
filter_by()直接用屬性名,比較用=不支持不支持
filter()用類名.屬性名,比較用==支持支持

談 filter_by() 的語法之前先看下 filter_by() 的內(nèi)部源碼,去掉注釋之后如下:

def filter_by(self, **kwargs):clauses = [_entity_descriptor(self._joinpoint_zero(), key) == valuefor key, value in kwargs.items()]return self.filter(sql.and_(*clauses))

可以看出,filter_by() 只接受鍵值對(duì)參數(shù),所以 filter_by() 不支持><(大于和小于)和 and_、or_查詢

?

user表

filter_by()
?????? 查詢 user 表里面名字等于 Tom 的:
???????db.session.query(User).filter_by(name='Tom').all()
?????? 查詢 user 表里面名字等于 Tom?并且年齡等于 18:
???????db.session.query(User).filter_by(name='Tom', age=18).all()
?????? 比如新的需求,查詢 user 表里面名字等于 Tom?或者年齡等于 18 的用戶,那么 filter_by() 就滿足不了要求了

filter()
?????? 查詢 user 表里面名字等于 Tom 的:
???????db.session.query(User).filter(User.name == 'Tom').all()
?????? 查詢 user 表里面名字等于 Tom 并且年齡等于 18:
???????db.session.query(User).filter(User.name == 'Tom', User.age == 18).all()
?????? 也可以這樣:
???????db.session.query(User).filter(User.name == 'Tom').filter(User.age == 18).all()
?????? 如果想使用 and 拼接需要用以下方式:
???????db.session.query(User).filter(and_(User.name == 'Tom', User.age == 18)).all()
?????? 以下的方式 and 后面的 User.age == 18 不會(huì)生效:
???????db.session.query(User).filter(User.name == 'Tom' and User.age == 18).all()
?????? 查詢 user 表里面名字等于 Tom 的或者年齡等于 18:
???????db.session.query(User).filter(or_(User.name == 'Tom', User.age == 18)).all()
?????? 查詢 user 表里面名字等于 Tom 的并且年齡大于 18
???????db.session.query(User).filter(User.name == 'Tom', User.age > 18).all()
?????? 查詢 name 中包含字母 a 的所有數(shù)據(jù)(模糊查詢)
???????db.session.query(User).filter(User.name.like('%{0}%'.format("a"))).all()

以上的例子都是查詢中使用比較多的,使用方面看大家喜好,filter_by() 對(duì)組合查詢等等支持的不是很好,但是語法相對(duì) filter() 簡潔一些; 另外 filter() 還有很多其他的查詢,大家可以自己去多多探討。。。

筆記:

?

?

現(xiàn)在有 mysql 的 user 數(shù)據(jù)庫表,存儲(chǔ)內(nèi)容如下圖,下面通過例子來說明兩種查詢方式的用法:

在一個(gè)用戶的模型類中, 要查詢id為5的一個(gè)用戶;

User.query.filter(User.id==5).all() ?# ?使用filter 中必須指定那個(gè) 模型類.id==5;?

User.query.filter(User.id==5).first() ?#?all() , first() ,都是查詢執(zhí)行器 , 一個(gè)返回列表包含對(duì)象, 一個(gè)直接返回對(duì)象;

User.query.filter_by(id=5).first() ?#?filter_by默認(rèn)就是使用id ?進(jìn)行查詢 , 寫法為id=5; 不可以使用==; 也不用模型類.id的方式; 它是一種更加精確的查詢;

?

?

# users = User.query.filter_by(isdelete=False).all()? ? ? ? 用等值符號(hào)


# users = User.query.filter(User.isdelete == False,

? ? ? ? ? ? ? ? ? ?User.phone.startswith('150')).order_by(-User.rdatetime)? 用關(guān)系符號(hào) 升序降序正負(fù)號(hào)


users = User.query.filter(or_(User.username==search,?User.phone == search)).all()? # select * from user where username=search or phone=search


number = User.query.filter(or_(User.username==search,User.phone == search)).count()


users = User.query.filter(or_(User.username.like('%' + search + '%'), User.phone == search)).all()? #返回的是列表


number = User.query.filter(or_(User.username.like(search), User.phone == search)).count()? ?
???

?

<a href="javascript:0;" onclick="del({{user.id}})">刪除</a> 跳過hrf 執(zhí)行js腳本

總結(jié)

以上是生活随笔為你收集整理的SQLAlchemy中filter_by()和filter()的用法不同的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。