成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Tornado-09、SQLalchemy的查詢

dendoink / 1423人閱讀

摘要:前兩個(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

相關(guān)文章

  • Flask-SQLAlchemy 學(xué)習(xí)總結(jié)

    摘要:初始化和配置對(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ò)展,能...

    whataa 評(píng)論0 收藏0
  • Python-SQLAlchemy:第1節(jié):SQLAlchemy入門(mén)

    摘要:下一篇文章第節(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)系...

    noONE 評(píng)論0 收藏0
  • Flask擴(kuò)展之flask-sqlalchemy(上)

    摘要:查詢記錄在調(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...

    KaltZK 評(píng)論0 收藏0
  • Python-SQLAlchemy:第3節(jié):關(guān)系操作

    摘要:本節(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ù)是建立...

    William_Sang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

dendoink

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<