摘要:前兩個(gè)查詢的是所以返回結(jié)果也是一個(gè)對(duì)象,但是查詢的是屬性值,所以返回的是屬性值。多表查詢多表查詢也是必須要掌握的知識(shí)點(diǎn)。原生的查詢以及其他使用再次強(qiáng)調(diào),使用或者原生沒(méi)有絕對(duì)的那個(gè)好一點(diǎn),怎么方便怎么使用。
1.帶條件的查詢
查詢是最常用的,對(duì)于各種查詢我們必須要十分清楚,首先是帶條件的查詢
#查詢特定字段 rows = session.query(User).filter_by(username="budong").all() print(rows) # 返回User對(duì)象 rows1 = session.query(User).filter(User.username=="budong").all() print(rows1) # 返回User對(duì)象 rows2 = session.query(User.username).filter(User.
username=="budong").all() # 返回的是值
print(rows2) rows3 = session.query(User.username).filter(User.username=="budong") print(rows3) # 返回的是值
filter_by和filter都是過(guò)濾條件,只是用法有區(qū)別filter_by里面不能用!=還有> < 等等,所有filter用得更多,filter_by只能用=。
前兩個(gè)查詢的是User,所以返回結(jié)果也是一個(gè)對(duì)象,但是rows2查詢的是屬性值,所以返回的是屬性值。
rows3可以看到SQLAlchemy轉(zhuǎn)成的SQL語(yǔ)句,SQLAlchemy最后都是會(huì)轉(zhuǎn)成SQL語(yǔ)句,通過(guò)這個(gè)方法可以查看原生SQL,甚至有些時(shí)候我們需要把SQLAlchemy轉(zhuǎn)成的SQL交給DBA審查,合適的才能使用。
查詢要知道查詢結(jié)果的返回怎樣的數(shù)據(jù)
#基本查詢 print( session.query(User).filter(User.username=="budong").all() ) print( session.query(User).filter(User.username=="budong").first()) print( session.query(User).filter(User.username=="budong").one()) print( session.query(User).get(2))
上面三條記錄,第一個(gè)查出所有符合條件的記錄,第二個(gè)查出所有符合記錄的第一條記錄,第三個(gè)返回一個(gè)對(duì)象,如果結(jié)果有多條就會(huì)報(bào)錯(cuò),第四個(gè)通過(guò)主鍵獲取記錄
除此之外,我們偶爾也會(huì)需要限制返回的結(jié)果數(shù)量
#限制查詢返回結(jié)果 print( session.query(User).filter(User.username!="budong").limit(2).all()) # 最多返回兩條記錄 print( session.query(User).filter(User.username!="budong").offset(2).all()) # 從第3條記錄開(kāi)始返回 print( session.query(User).filter(User.username!="budong").slice(2,3).all()) # 截取第2到第3條 #可以排序之后再進(jìn)行限制 from sqlalchemy import desc print( session.query(User).filter(User.username!="budong").order_by(User.username).all()) print( session.query(User).filter(User.username!="budong").order_by(desc(User.username)).slice(1,3).all())
第一個(gè)是限制返回條數(shù),從第一條開(kāi)始;第二個(gè)是從第三條開(kāi)始返回查詢結(jié)果;第三個(gè)是切片返回記錄。
order_by默認(rèn)是順序,desc是降序。
還有其他的帶條件查詢
#不等于 print( session.query(User).filter(User.username!="budong").all() ) #模糊匹配 like print( session.query(User).filter(User.username.like("budong")).all() ) print( session.query(User).filter(User.username.notlike("budong")).all() ) #成員屬于 in_ print( session.query(User).filter(User.username.in_(["budong","tuple"])).all() ) #成員不屬于 notin_ print( session.query(User).filter(User.username.notin_(["budong","tuple"])).all() ) #空判斷 print( session.query(User).filter(User.username==None).all() ) print( session.query(User).filter(User.username.is_(None)).all() ) print( session.query(User).filter(User.username.isnot(None)).all() ) #多條件 print( session.query(User).filter(User.username.isnot(None),User.password=="qwe123").all() ) #選擇條件 from sqlalchemy import or_,and_,all_,any_ print( session.query(User).filter(or_(User.username=="budong",User.password=="qwe123")).all() ) print( session.query(User).filter(and_(User.username=="budong",User.password=="111")).all() )
以上是各種帶條件的查詢,大家知道怎么使用,但是需要注意的是,所以的模糊匹配是十分耗費(fèi)時(shí)間的,能不用就盡量不要用。
當(dāng)然還有聚合函數(shù)的使用
#聚合函數(shù)的使用 from sqlalchemy import func,extract print( session.query(User.password,func.count(User.id)).group_by(User.password).all() ) # 按密碼進(jìn)行分組 統(tǒng)計(jì)密碼相同的有多少個(gè) print( session.query(User.password,func.count(User.id)).group_by(User.password).having(func.count(User.id)>1).all() ) # 查出所有id>1的信息 print( session.query(User.password,func.sum(User.id)).group_by(User.password).all() ) print( session.query(User.password,func.max(User.id)).group_by(User.password).all() ) print( session.query(User.password,func.min(User.id)).group_by(User.password).all() ) #使用extract提取時(shí)間中的分鐘或者天來(lái)分組 print( session.query(extract("minute", User.creatime).label("minute"),func.count("*").label("count")).group_by("minute").all() ) print( session.query(extract("day", User.creatime).label("day"),func.count("*").label("count")).group_by("day").all() )
這里只是告訴大家的用法,其中g(shù)roup_by是分組,如果要使用聚合函數(shù),就必須導(dǎo)入func,label是取別名的意思 。
2.表關(guān)系查詢對(duì)于有表關(guān)系的,也有些不同的查詢,首先我們來(lái)建立一個(gè)有外鍵關(guān)系的表
from sqlalchemy.orm import relationship from sqlalchemy import ForeignKey class UserDetails(Base): __tablename__ = "user_details" id = Column(Integer,primary_key=True,autoincrement=True) id_card = Column(Integer,nullable=False,unique=True) lost_login = Column(DateTime) login_num = Column(Integer,default=0) user_id = Column(Integer,ForeignKey("user.id")) userdetail_for_foreignkey = relationship("User",backref="details",uselist=False,cascade="all") def __repr__(self): return ""%( self.id, self.id_card, self.login_login, self.login_num, self.user_id )
這里要注意relationship默認(rèn)是一對(duì)多的關(guān)系,使用uselist=False則表示一對(duì)一的關(guān)系,cascade 是自動(dòng)關(guān)系處理,就和MySQL中的ON DELETE類似,但是有區(qū)別,參數(shù)選項(xiàng)如下:
cascade 所有的可選字符串項(xiàng)是:
all , 所有操作都會(huì)自動(dòng)處理到關(guān)聯(lián)對(duì)象上.
save-update , 關(guān)聯(lián)對(duì)象自動(dòng)添加到會(huì)話.
delete , 關(guān)聯(lián)對(duì)象自動(dòng)從會(huì)話中刪除.
delete-orphan , 屬性中去掉關(guān)聯(lián)對(duì)象, 則會(huì)話中會(huì)自動(dòng)刪除關(guān)聯(lián)對(duì)象.
merge , session.merge() 時(shí)會(huì)處理關(guān)聯(lián)對(duì)象.
refresh-expire , session.expire() 時(shí)會(huì)處理關(guān)聯(lián)對(duì)象.
expunge , session.expunge() 時(shí)會(huì)處理關(guān)聯(lián)對(duì)象.
有如上的表關(guān)系之后,查詢可以十分方便
#表關(guān)系查詢 row = session.query(UserDetails).all() print(row,dir(row[0])) row = session.query(User).filter(User.id==1).first() print(row,dir(row)) print(row.details) print(row.details[0].lost_login)
relationship會(huì)在User表里面添加一個(gè)屬性,通過(guò)這個(gè)屬性就可以查詢對(duì)應(yīng)的user_details表中的所有字段。省去了很多的代碼。
3.多表查詢多表查詢也是必須要掌握的知識(shí)點(diǎn)。以下是常見(jiàn)的幾種表關(guān)聯(lián)方式,需要熟練掌握。
#多表查詢 print( session.query(UserDetails,User).all() ) #這個(gè)是 cross join print( session.query(UserDetails,User).filter(User.id==UserDetails.id).all() ) #這是也是cross join 但是加上了where條件 print( session.query(User.username,UserDetails.lost_login).join(UserDetails,UserDetails.id==User.id).all() ) #這個(gè)是inner join print( session.query(User.username,UserDetails.lost_login).outerjoin(UserDetails,UserDetails.id==User.id).all() ) #這個(gè)才是左連接,sqlalchemy沒(méi)有右連接 q1 = session.query(User.id) q2 = session.query(UserDetails.id) print(q1.union(q2).all()) #這個(gè)是union關(guān)聯(lián)
除了上面的幾種關(guān)聯(lián)方式,子表查詢也是用得很多的,也是要掌握的
from sqlalchemy import all_,any_ sql_0 = session.query(UserDetails.lost_login).subquery() #這是聲明一個(gè)子表 print( session.query(User).filter((User.creatime > all_(sql_0)) ).all() ) print( session.query(User).filter((User.creatime > any_(sql_0)) ).all() )
注意any_和all_的區(qū)別,all_要求的是所有都滿足,any_只需要有滿足的就行。
4.原生SQL的查詢以及其他使用再次強(qiáng)調(diào),使用ORM或者原生SQL沒(méi)有絕對(duì)的那個(gè)好一點(diǎn),怎么方便怎么使用。
#第一步寫(xiě)好原生的sql,如果需要傳遞參數(shù),可以使用字符串拼接的方式 sql_1 = """ select * from `user` """ #第二步執(zhí)行,得到返回的結(jié)果 row = session.execute(sql_1) print(row,dir(row)) #第三步,自己控制得到數(shù)據(jù)的方式 print( row.fetchone() ) print( row.fetchmany() ) print( row.fetchall() ) #也可以循環(huán)獲得 for i in row: print("===",i)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44709.html
摘要:初始化和配置對(duì)象關(guān)系映射。的則需要在中聲明。例如配置信息中指出是可以綁定多個(gè)數(shù)據(jù)庫(kù)引擎。是通過(guò)解決一對(duì)多的關(guān)系。將會(huì)返回學(xué)院學(xué)生人數(shù)將會(huì)返回學(xué)生的學(xué)院信息的類實(shí)例。處理關(guān)系對(duì)象查詢中有詳細(xì)的說(shuō)明。 初始化和配置 ORM(Object Relational Mapper) 對(duì)象關(guān)系映射。指將面對(duì)對(duì)象得方法映射到數(shù)據(jù)庫(kù)中的關(guān)系對(duì)象中。Flask-SQLAlchemy是一個(gè)Flask擴(kuò)展,能...
摘要:下一篇文章第節(jié)查詢條件設(shè)置是編程語(yǔ)言下的一款開(kāi)源軟件。提供了工具包及對(duì)象關(guān)系映射工具,使用許可證發(fā)行。在關(guān)閉連接時(shí)會(huì)自動(dòng)進(jìn)行事務(wù)提交操作。引入多條件查詢時(shí)使用。由于上下文函數(shù)退出時(shí)會(huì)自動(dòng)提交事務(wù),所以無(wú)需顯示的調(diào)用使新增生效。 下一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置 SQLAlchemy是Python編程語(yǔ)言下的一款開(kāi)源軟件。提供了SQL工具包及對(duì)象關(guān)系...
摘要:查詢記錄在調(diào)試或測(cè)試模式自動(dòng)啟用??梢杂糜陲@式禁用原生支持。當(dāng)使用不合適的指定無(wú)編碼的數(shù)據(jù)庫(kù)默認(rèn)值時(shí),這對(duì)于一些數(shù)據(jù)庫(kù)適配器是必須的比如上某些版本的。這對(duì)是必要的,它默認(rèn)移除閑置多于小時(shí)的連接。注意如果使用了,自動(dòng)設(shè)定這個(gè)值為小時(shí)。 flask-sqlalchemy是flask的一個(gè)ORM擴(kuò)展框架,這個(gè)擴(kuò)展在sqlalchemy的進(jìn)行的擴(kuò)展,更方便的結(jié)合Flask.什么是ORM?其是O...
摘要:本節(jié)圍繞在中如何定義關(guān)系及如何使用關(guān)系進(jìn)行查詢進(jìn)行講解,使讀者能夠快速掌握的關(guān)系操作。班級(jí)與學(xué)生為一對(duì)多關(guān)系,班級(jí)與老師之間為多對(duì)多關(guān)系。三年二班多對(duì)多關(guān)系的使用通過(guò)關(guān)聯(lián)模型實(shí)現(xiàn),在其中分別設(shè)置模型和的外鍵,并且在父模型中設(shè)置相應(yīng)的實(shí)現(xiàn)。 上一篇文章:Python-SQLAlchemy:第2節(jié):查詢條件設(shè)置下一篇文章:Python-SQLAlchemy:第4節(jié):級(jí)聯(lián) 關(guān)系數(shù)據(jù)庫(kù)是建立...
閱讀 2175·2021-11-11 16:55
閱讀 1697·2019-08-30 15:54
閱讀 2827·2019-08-30 15:53
閱讀 2224·2019-08-30 15:44
閱讀 1159·2019-08-30 15:43
閱讀 974·2019-08-30 11:22
閱讀 1954·2019-08-29 17:20
閱讀 1576·2019-08-29 16:56