摘要:前兩個查詢的是所以返回結果也是一個對象,但是查詢的是屬性值,所以返回的是屬性值。多表查詢多表查詢也是必須要掌握的知識點。原生的查詢以及其他使用再次強調,使用或者原生沒有絕對的那個好一點,怎么方便怎么使用。
1.帶條件的查詢
查詢是最常用的,對于各種查詢我們必須要十分清楚,首先是帶條件的查詢
#查詢特定字段 rows = session.query(User).filter_by(username="budong").all() print(rows) # 返回User對象 rows1 = session.query(User).filter(User.username=="budong").all() print(rows1) # 返回User對象 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都是過濾條件,只是用法有區別filter_by里面不能用!=還有> < 等等,所有filter用得更多,filter_by只能用=。
前兩個查詢的是User,所以返回結果也是一個對象,但是rows2查詢的是屬性值,所以返回的是屬性值。
rows3可以看到SQLAlchemy轉成的SQL語句,SQLAlchemy最后都是會轉成SQL語句,通過這個方法可以查看原生SQL,甚至有些時候我們需要把SQLAlchemy轉成的SQL交給DBA審查,合適的才能使用。
查詢要知道查詢結果的返回怎樣的數據
#基本查詢 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))
上面三條記錄,第一個查出所有符合條件的記錄,第二個查出所有符合記錄的第一條記錄,第三個返回一個對象,如果結果有多條就會報錯,第四個通過主鍵獲取記錄
除此之外,我們偶爾也會需要限制返回的結果數量
#限制查詢返回結果 print( session.query(User).filter(User.username!="budong").limit(2).all()) # 最多返回兩條記錄 print( session.query(User).filter(User.username!="budong").offset(2).all()) # 從第3條記錄開始返回 print( session.query(User).filter(User.username!="budong").slice(2,3).all()) # 截取第2到第3條 #可以排序之后再進行限制 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())
第一個是限制返回條數,從第一條開始;第二個是從第三條開始返回查詢結果;第三個是切片返回記錄。
order_by默認是順序,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() )
以上是各種帶條件的查詢,大家知道怎么使用,但是需要注意的是,所以的模糊匹配是十分耗費時間的,能不用就盡量不要用。
當然還有聚合函數的使用
#聚合函數的使用 from sqlalchemy import func,extract print( session.query(User.password,func.count(User.id)).group_by(User.password).all() ) # 按密碼進行分組 統計密碼相同的有多少個 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提取時間中的分鐘或者天來分組 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() )
這里只是告訴大家的用法,其中group_by是分組,如果要使用聚合函數,就必須導入func,label是取別名的意思 。
2.表關系查詢對于有表關系的,也有些不同的查詢,首先我們來建立一個有外鍵關系的表
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默認是一對多的關系,使用uselist=False則表示一對一的關系,cascade 是自動關系處理,就和MySQL中的ON DELETE類似,但是有區別,參數選項如下:
cascade 所有的可選字符串項是:
all , 所有操作都會自動處理到關聯對象上.
save-update , 關聯對象自動添加到會話.
delete , 關聯對象自動從會話中刪除.
delete-orphan , 屬性中去掉關聯對象, 則會話中會自動刪除關聯對象.
merge , session.merge() 時會處理關聯對象.
refresh-expire , session.expire() 時會處理關聯對象.
expunge , session.expunge() 時會處理關聯對象.
有如上的表關系之后,查詢可以十分方便
#表關系查詢 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會在User表里面添加一個屬性,通過這個屬性就可以查詢對應的user_details表中的所有字段。省去了很多的代碼。
3.多表查詢多表查詢也是必須要掌握的知識點。以下是常見的幾種表關聯方式,需要熟練掌握。
#多表查詢 print( session.query(UserDetails,User).all() ) #這個是 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() ) #這個是inner join print( session.query(User.username,UserDetails.lost_login).outerjoin(UserDetails,UserDetails.id==User.id).all() ) #這個才是左連接,sqlalchemy沒有右連接 q1 = session.query(User.id) q2 = session.query(UserDetails.id) print(q1.union(q2).all()) #這個是union關聯
除了上面的幾種關聯方式,子表查詢也是用得很多的,也是要掌握的
from sqlalchemy import all_,any_ sql_0 = session.query(UserDetails.lost_login).subquery() #這是聲明一個子表 print( session.query(User).filter((User.creatime > all_(sql_0)) ).all() ) print( session.query(User).filter((User.creatime > any_(sql_0)) ).all() )
注意any_和all_的區別,all_要求的是所有都滿足,any_只需要有滿足的就行。
4.原生SQL的查詢以及其他使用再次強調,使用ORM或者原生SQL沒有絕對的那個好一點,怎么方便怎么使用。
#第一步寫好原生的sql,如果需要傳遞參數,可以使用字符串拼接的方式 sql_1 = """ select * from `user` """ #第二步執行,得到返回的結果 row = session.execute(sql_1) print(row,dir(row)) #第三步,自己控制得到數據的方式 print( row.fetchone() ) print( row.fetchmany() ) print( row.fetchall() ) #也可以循環獲得 for i in row: print("===",i)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44709.html
摘要:初始化和配置對象關系映射。的則需要在中聲明。例如配置信息中指出是可以綁定多個數據庫引擎。是通過解決一對多的關系。將會返回學院學生人數將會返回學生的學院信息的類實例。處理關系對象查詢中有詳細的說明。 初始化和配置 ORM(Object Relational Mapper) 對象關系映射。指將面對對象得方法映射到數據庫中的關系對象中。Flask-SQLAlchemy是一個Flask擴展,能...
摘要:下一篇文章第節查詢條件設置是編程語言下的一款開源軟件。提供了工具包及對象關系映射工具,使用許可證發行。在關閉連接時會自動進行事務提交操作。引入多條件查詢時使用。由于上下文函數退出時會自動提交事務,所以無需顯示的調用使新增生效。 下一篇文章:Python-SQLAlchemy:第2節:查詢條件設置 SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對象關系...
摘要:查詢記錄在調試或測試模式自動啟用。可以用于顯式禁用原生支持。當使用不合適的指定無編碼的數據庫默認值時,這對于一些數據庫適配器是必須的比如上某些版本的。這對是必要的,它默認移除閑置多于小時的連接。注意如果使用了,自動設定這個值為小時。 flask-sqlalchemy是flask的一個ORM擴展框架,這個擴展在sqlalchemy的進行的擴展,更方便的結合Flask.什么是ORM?其是O...
摘要:本節圍繞在中如何定義關系及如何使用關系進行查詢進行講解,使讀者能夠快速掌握的關系操作。班級與學生為一對多關系,班級與老師之間為多對多關系。三年二班多對多關系的使用通過關聯模型實現,在其中分別設置模型和的外鍵,并且在父模型中設置相應的實現。 上一篇文章:Python-SQLAlchemy:第2節:查詢條件設置下一篇文章:Python-SQLAlchemy:第4節:級聯 關系數據庫是建立...
閱讀 2164·2021-11-11 16:55
閱讀 1685·2019-08-30 15:54
閱讀 2817·2019-08-30 15:53
閱讀 2211·2019-08-30 15:44
閱讀 1152·2019-08-30 15:43
閱讀 965·2019-08-30 11:22
閱讀 1942·2019-08-29 17:20
閱讀 1566·2019-08-29 16:56