• <u id="vypo2"><meter id="vypo2"></meter></u>
  • <s id="vypo2"><dfn id="vypo2"><noscript id="vypo2"></noscript></dfn></s>
    <dfn id="vypo2"><noscript id="vypo2"></noscript></dfn>

  • <s id="vypo2"></s>

    您所在的位置: > 主頁 > 佛山都市網 > 美食 > 正文
    如何更好的使用flask-SQLAlchemy來源: 日期:2020-03-23 07:23:27  閱讀:-

      SQLAlchemy配置

      安裝flask-sqlalchemy,它是對SQLAlchemy基于flask的封裝,SQLAlchemy是python的orm框架并不是針對特定web的框架。

      配置數據庫

      這db初始化APP使用的db=SQLAlchemy(app)這種方式,這樣初始化的時候就會加載上下文環境,比如在交互式環境下,就可以直接User.query.get(1)查詢,還有一種初始化方式,db.init_app(app)這種方式在初始化的時候不會加載上下文環境,在交互式模式下操作數據庫時需要手動加載,例如

      with app.app_context():
      User.query.get(1)

      但是無論哪種方式,在視圖中進行數據查詢時,都不要手動加載上下文,因為在視圖中執行數據庫操作時,服務已經啟動,在視圖中上下文環境已經加載好了。

      SQLALCHEMY_ECHO = True 

      SQLALCHEMY_ECHO = True輸出效果

      在進行數據庫操作時輸出操作數據庫的日志,包括sql語句,方便調試,可以在測試環境打開線上關閉。

      新增數據

      添加單個數據

      db.session.add(user)

      添加多個數據,需傳遞一個列表

      db.session.add_all(users)

      基礎查詢

      User.query.get() 使用主鍵查詢,get()方法只能傳入主鍵

      User.query.get(1)
      Out[3]: &lt;User 1&gt;

      User.query.filter_by() 做一些簡單的查詢,只能使用單個條件或者and,稍微復雜的一點的類似!=者or則不支持

      User.query.filter_by(name=&#39;itcast&#39;).first()
      Out[5]: &lt;User 1&gt;

      User.query.filter() 相比filter_by則能做的更多,大部分的復雜查詢也都是用filter()來做

      db.session.query(User).all(),上面的查詢都是基于flask-sqlalchemy來進行的,這個是直接使用SQLAlchemy來操作數據庫

      offset、limit查詢

      offset從指定位置開始查詢,limit從開始位置返回指定個數數據,例如現在有個需求從第二個位置開始返回兩個用戶,

      User.query.offset(2).limit(2).all()
      Out[10]: [&lt;User 4&gt;, &lt;User 5&gt;]
      對應的sql就是
      select * from user_basic limit 2,2

      模糊查詢

      User.query.filter(User.name.startwith(&#39;itcast&#39;)).all()

      查詢用戶名是已itcast開頭的用戶,對應sql語法,name like &#39;itcast%&#39; 還可以是User.name.endwith(&#39;&#39;),對應sql中的語法是name like &#39;%itcast&#39;

      指定字段查詢

      在查詢數據庫是,通常不會直接select *進行查詢,需要指定字段,在flask-sqlalchemy中需要指定字段需要導入額外的方法來支持。

      from sqlalchemy.orm import load_only
      User.query.options(load_only(User.name,User.mobile))
      .filter(User.id == 1).first()
      Out[12]: &lt;User 1&gt;

      對應sql語句就就是

      select name, mobile from user where id=1 limit 1;

      使用聚合函數

      在flask-sqlalchemy使用聚合需要導入新函數,from sqlalchemy import func

      db.session.query(Relation.user_id, func.count(Relation.target_user_id))
      .group_by(Relation.user_id).all()
      Out[26]: [(1, 3)]

      列表中每個元組的第一位表示user_id,第二位表示聚合結果,上面查詢語句對應sql

      select user_id, target_user_id from user_relation group_by(user_id)

      關聯查詢

      1、使用外鍵關聯查詢

      建表的時候,我們將用戶的基本常用信息存儲在user_basic表中,另外的一些不常用的存儲在user_profile表中,在查詢的時候,如何通過user.profile就能查詢出profile表中存儲的信息呢?

      現在從表中指定外鍵,然后在主表指定額外的字段,進行關聯查詢,注意在從表設置外鍵是,里面傳的一定要是數據庫中真實的表名和字段名。

      id = db.Column(&#39;relation_id&#39;, db.Integer, db.ForeignKey(&#39;user_basic.user_id&#39;),
      primary_key=True, doc=&#39;主鍵ID&#39;)

      在主表指定關聯字段

      profile = db.relationship(&#34;UserProfile&#34;, uselist=False)

      直接使用user.profile調用,以下是輸出結果

      2、使用primaryjoin關聯查詢

      在user_basic表中修改關聯字段屬性,db.relationship這種額外聲明的字段屬性,不對應數據庫表的字段,不是映射字段,只是為了方便進行關聯查詢的時候使用

      profile = db.relationship(&#39;UserProfile&#39;, 
      primaryjoin=&#39;User.id==foreign(UserProfile.id)&#39;, uselist=False)

      user.profile調用和上面的輸出結果一樣。

      3、指定字段關聯查詢

      上面的兩種方式都需要兩步才能查詢出結果,那么如何一次性查出呢。比如現在有一個需求需要查詢user_id=1用戶所關注用戶的信息,sql語句實現如下

      select a.user_id,b.user_name,b.mobile from user_relation as a 
      inner join user_basic as b on a.target_user_id=b.user_id
      where a.user_id=1;

      現在Relation表中增加關聯字段,

      user = db.relationship(&#39;User&#39;, 
      primaryjoin=&#34;Relation.target_user_id==foreign(User.id)&#34;)

      具體查詢語句如下

      執行效果

      從debug日志中,拿出SQLAlchemy生成的查詢語句和我們自己寫的看看是否一樣

      SELECT user_relation.relation_id AS user_relation_relation_id, user_basic.user_id AS user_basic_user_id, user_basic.user_name AS user_basic_user_name, user_relation.user_id AS user_relation_user_id, user_relation.target_user_id AS user_relation_target_user_id

      FROM user_relation INNER JOIN user_basic ON user_relation.target_user_id = user_basic.user_id

      WHERE user_relation.user_id = %(user_id_1)s,可以看出和之前寫的sql語句是一樣。

      私信我,可獲取此文章的python代碼包括model以及建表語句和測試數據,你們的關注是我創作的最大動力

      (正文已結束)

      免責聲明及提醒:此文內容為本網所轉載企業宣傳資訊,該相關信息僅為宣傳及傳遞更多信息之目的,不代表本網站觀點,文章真實性請瀏覽者慎重核實!任何投資加盟均有風險,提醒廣大民眾投資需謹慎!

    91免费在线视频,91免费自拍视频,91嫩草国产在线观看免费,91嫩草国产在线看网站,91你懂的视频,91麻豆精品福利在线观看,91免费播放人人爽人人快乐,91免费国产自产地址入,91免费国自产拍在线,91免费精品视频,一级生性活片全黄在线观看,一级生性活片在线观看视频l,一级牲交大片无遮挡,一级牲交免费视频,一级牲交视频播放,99热精品在线,99热精品在线观看,99热精品只有这里有,99热热这里只有精品,99热婷婷国产精品综合