Flask操作數據庫查詢


常用的SQLAlchemy查詢過濾器

過濾器 說明
filter() 把過濾器添加到原查詢上,返回一個新查詢
filter_by() 把等值過濾器添加到原查詢上,返回一個新查詢
limit 使用指定的值限定原查詢返回的結果
offset() 偏移原查詢返回的結果,返回一個新查詢
order_by() 根據指定條件對原查詢結果進行排序,返回一個新查詢
group_by() 根據指定條件對原查詢結果進行分組,返回一個新查詢

常用的SQLAlchemy查詢執行器

 

方法 說明
all() 以列表形式返回查詢的所有結果
first() 返回查詢的第一個結果,如果未查到,返回None
first_or_404() 返回查詢的第一個結果,如果未查到,返回404
get() 返回指定主鍵對應的行,如不存在,返回None
get_or_404() 返回指定主鍵對應的行,如不存在,返回404
count() 返回查詢結果的數量
paginate() 返回一個Paginate對象,它包含指定范圍內的結果

查詢表中全部
Role.query.all()
Out[2]: [<db_demo.Role at 0x10388d190>, <db_demo.Role at 0x10388d310>]

In [3]: li = Role.query.all()

In [4]: li
Out[4]: [<db_demo.Role at 0x10388d190>, <db_demo.Role at 0x10388d310>]

In [5]: r = li[0]

In [6]: type(r)
Out[6]: db_demo.Role

In [7]: r.name
Out[7]: u'admin'

-------------------
查詢單條

In [8]: Role.query.first()
Out[8]: <db_demo.Role at 0x10388d190>

In [9]: r = Role.query.first()

In [10]: r.name
Out[10]: u'admin'

--------------------
#  根據主鍵id獲取對象,get要傳一個主鍵ID的值
In [11]: r = Role.query.get(2)

In [12]: r
Out[12]: <db_demo.Role at 0x10388d310>

In [13]: r.name
Out[13]: u'stuff'

In [14]:

-----------------------------------
# 另一種查詢方式,這是最原始的方法
In [15]: db.session.query(Role).all()
Out[15]: [<db_demo.Role at 0x10388d190>, <db_demo.Role at 0x10388d310>]

In [16]: db.session.query(Role).get(2)
Out[16]: <db_demo.Role at 0x10388d310>

In [17]: db.session.query(Role).first()
Out[17]: <db_demo.Role at 0x10388d190>

In [18]:
-------------------------------------
# 按條件查詢
In [18]: User.query.filter_by(name="wang")
Out[18]: <flask_sqlalchemy.BaseQuery at 0x1038c90d0>

In [19]: User.query.filter_by(name="wang").all()
Out[19]: [<db_demo.User at 0x1038c87d0>]

In [20]: User.query.filter_by(name="wang").first()
Out[20]: <db_demo.User at 0x1038c87d0>

In [21]: user = User.query.filter_by(name="wang").first()

In [22]: user.name
Out[22]: u'wang'

In [23]: user.email
Out[23]: u'wang@163.com'
--------------------------------
# 條件查詢,“且”關系
In [24]: User.query.filter_by(name="wang", role_id=1).first()
Out[24]: <db_demo.User at 0x1038c87d0>

In [25]: User.query.filter_by(name="wang", role_id=2).first()

In [26]: user = User.query.filter_by(name="wang", role_id=2).first()

In [27]: type(user)
Out[27]: NoneType

In [28]:
--------------------------------------------
# filter_by是filter的特殊方法
In [28]: user = User.query.filter(User.name=="wang", User.role_id==1).first
    ...: ()

In [29]: user
Out[29]: <db_demo.User at 0x1038c87d0>

In [30]: user.name
Out[30]: u'wang'

-----------------------------------------
# 引入類這是"或"關系
In [31]: from sqlalchemy import or_

In [32]: User.query.filter(or_(User.name=="wang", User.email.endswith("163.com")
    ...: )).all()
Out[32]: [<db_demo.User at 0x1038c87d0>, <db_demo.User at 0x1038ef310>]

In [33]: li = User.query.filter(or_(User.name=="wang", User.email.endswith("163.
    ...: com"))).all()

In [34]: li[0].name
Out[34]: u'wang'

In [35]: li[1].name
Out[35]: u'zhou'

In [36]:

--------------------------------------------
# offset偏移  跳過幾條
# User.query.offset().limit().order_by().all()
In [36]: User.query.offset(2).all()
Out[36]: [<db_demo.User at 0x1038c0950>, <db_demo.User at 0x1038ef310>]

In [37]: li = User.query.offset(2).all()

In [38]: li[0].name
Out[38]: u'chen'

In [39]: li[1].name
Out[39]: u'zhou'

In [40]:

-------------------------------
# 后面必須跟上all()否則取不出來
In [42]: li = User.query.offset(1).limit(2).all()

In [43]: li
Out[43]: [<db_demo.User at 0x1038fd990>, <db_demo.User at 0x1038c0950>]

In [44]: li[0].name
Out[44]: u'zhang'

In [45]: li[1].name
Out[45]: u'chen'

In [46]:
-------------------------------
# 排序
In [50]: User.query.order_by("-id").all()
Out[50]:
[<db_demo.User at 0x1038ef310>,
 <db_demo.User at 0x1038c0950>,
 <db_demo.User at 0x1038fd990>,
 <db_demo.User at 0x1038c87d0>]

In [51]:
# 官方版本,降序desc(),升序asc()
In [51]: li = User.query.order_by(User.id.desc()).all()

In [52]: li
Out[52]:
[<db_demo.User at 0x1038ef310>,
 <db_demo.User at 0x1038c0950>,
 <db_demo.User at 0x1038fd990>,
 <db_demo.User at 0x1038c87d0>]

In [53]: li[0].name
Out[53]: u'zhou'

In [54]: li[3].name
Out[54]: u'wang'

In [55]:

----------------------
# 分組查詢,func里包含聚合方法
In [55]: from sqlalchemy import func

In [56]: db.session.query(User.role_id, func.count(User.role_id)).group_by(User.role_id)
Out[56]: <flask_sqlalchemy.BaseQuery at 0x103a38050>

In [57]: db.session.query(User.role_id, func.count(User.role_id)).group_by(User.role_id).all()
Out[57]: [(1L, 2L), (2L, 2L)]

In [58]:

-------------------------
# 關聯查詢,反向查詢
In [61]: ro = Role.query.get(1)

In [62]: type(ro)
Out[62]: db_demo.Role

In [63]: ro.users
Out[63]: [<db_demo.User at 0x1038c87d0>, <db_demo.User at 0x1038ef310>]

In [64]: ro.users[0].name
Out[64]: u'wang'

In [65]: ro.users[1].name
Out[65]: u'zhou'

In [66]:
--------------------------
# 正向查詢
In [67]: user
Out[67]: <db_demo.User at 0x1038c87d0>

In [68]: user.role_id
Out[68]: 1L

In [69]: Role.query.get(user.role_id)
Out[69]: <db_demo.Role at 0x10388d190>

# 這里可以方便的查詢user的role信息,backref值的神奇作用
In [70]: user.role
Out[70]: <db_demo.Role at 0x10388d190>

In [71]: user.role.name
Out[71]: u'admin'

In [72]:
-----------------------------
# 更新
# 1.原始方法
In [9]: user = User.query.get(1)

In [10]: user.name
Out[10]: 'python'

In [11]: user.name = 'itcast'

In [12]: db.session.add(user)

In [13]: db.session.commit()
-----------------------
# 簡便方法
In [14]: User.query.filter_by(name="zhou").update({"name": "python", "emai
    ...: l": "python@itast.cn"})
Out[14]: 1L

In [15]: db.session.commit()

In [16]:
------------------------
# 刪除
In [16]: user = User.query.get(3)

In [17]: db.session.delete(user)

In [18]: db.session.commit()

In [19]:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM