国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Tornado-09、SQLalchemy的查詢

dendoink / 1411人閱讀

摘要:前兩個查詢的是所以返回結果也是一個對象,但是查詢的是屬性值,所以返回的是屬性值。多表查詢多表查詢也是必須要掌握的知識點。原生的查詢以及其他使用再次強調,使用或者原生沒有絕對的那個好一點,怎么方便怎么使用。

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

相關文章

  • Flask-SQLAlchemy 學習總結

    摘要:初始化和配置對象關系映射。的則需要在中聲明。例如配置信息中指出是可以綁定多個數據庫引擎。是通過解決一對多的關系。將會返回學院學生人數將會返回學生的學院信息的類實例。處理關系對象查詢中有詳細的說明。 初始化和配置 ORM(Object Relational Mapper) 對象關系映射。指將面對對象得方法映射到數據庫中的關系對象中。Flask-SQLAlchemy是一個Flask擴展,能...

    whataa 評論0 收藏0
  • Python-SQLAlchemy:第1節:SQLAlchemy入門

    摘要:下一篇文章第節查詢條件設置是編程語言下的一款開源軟件。提供了工具包及對象關系映射工具,使用許可證發行。在關閉連接時會自動進行事務提交操作。引入多條件查詢時使用。由于上下文函數退出時會自動提交事務,所以無需顯示的調用使新增生效。 下一篇文章:Python-SQLAlchemy:第2節:查詢條件設置 SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對象關系...

    noONE 評論0 收藏0
  • Flask擴展之flask-sqlalchemy(上)

    摘要:查詢記錄在調試或測試模式自動啟用。可以用于顯式禁用原生支持。當使用不合適的指定無編碼的數據庫默認值時,這對于一些數據庫適配器是必須的比如上某些版本的。這對是必要的,它默認移除閑置多于小時的連接。注意如果使用了,自動設定這個值為小時。 flask-sqlalchemy是flask的一個ORM擴展框架,這個擴展在sqlalchemy的進行的擴展,更方便的結合Flask.什么是ORM?其是O...

    KaltZK 評論0 收藏0
  • Python-SQLAlchemy:第3節:關系操作

    摘要:本節圍繞在中如何定義關系及如何使用關系進行查詢進行講解,使讀者能夠快速掌握的關系操作。班級與學生為一對多關系,班級與老師之間為多對多關系。三年二班多對多關系的使用通過關聯模型實現,在其中分別設置模型和的外鍵,并且在父模型中設置相應的實現。 上一篇文章:Python-SQLAlchemy:第2節:查詢條件設置下一篇文章:Python-SQLAlchemy:第4節:級聯 關系數據庫是建立...

    William_Sang 評論0 收藏0

發表評論

0條評論

dendoink

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<