1. 程式人生 > >Flask框架(SQLAlchemy(python3版本)中查詢資料的方法,以及定義顯示資訊 )

Flask框架(SQLAlchemy(python3版本)中查詢資料的方法,以及定義顯示資訊 )

(SQLAlchemy中新增資料 )https://blog.csdn.net/wei18791957243/article/details/85256848 

    新增資料,新增好的表

     

SQlalchemy資料庫查詢

1. 查詢資料

     (1) 查詢表中的所有資料:    模型類.query.all()    # 返回每個資料的物件的列表

           例如:   li = Role.query.all()    # 儲存的是資料的物件,列表形式      Role 是一個模型類

                          li[0]   #   取第一個資料物件

                        li[0].name   # 就取出了第一個資料物件的name屬性,即在資料庫中的列名為name的第一個值

   

(2)查詢第一條資料:

               r = Role.query.first()     #   查詢到第一個條資料的物件

               r.name                 #  然後取出相應的值

              還有一種方法:  按照主鍵的值來進行查詢一條資料

              r = Role.query.get(2)           #    2  即查詢出主鍵為2  的那條資料的物件

              r.name     #  然後取出相應的值

    (3)  利用db.session 的方式查詢       

          查詢多條

               db.session.query(模型類).all()         # 返回的是一個數據物件列表   、

         查詢第一條

               db.session.query(模型類).first()         # 返回的是第一個資料物件

         查詢其中的一條

            db.session.query(模型類).get(主鍵的值)         # 返回的是一個數據物件

    2.   查詢資料的時候進行過濾

       (1)  模型類.query_filter_by(name="wang").all   # 查詢出name為wang的資料物件,返回的是一個列表,然後可以根                    據屬性來獲取相應的值                 也可以.first()  

               如果還有其他的條件,直接以逗號分隔在filter_by()裡面新增就行

              如果查詢的資料不存在返回None

     (2) 模型類.query_filter(模型類.name=="wang").all    #   需要指名  模型類.屬性    ,並且是雙等號

     (3)   查詢時使用    “或”  以及模糊查詢endswith()

                   匯入模組  :  from sqlalchemy import or_

                 #   如下:   查詢出 User模型類中的name屬性等於“wang”或者email屬性是以163.com結尾的資料物件

                 User.query.filter(or_(User.name=="wang",User.email.endswith("163.com"))).all()      #  返回列表

      (4)offset()   # 偏移:從第幾條開始查詢,  limit  ()  #   表示取幾條

         User.query.offset(2).limit(2).all     #   查詢,從表中第二條資料開始查詢,查詢出的結果取兩個,返回資料物件列表

       可以一起用,也可分開來用

     (5) flask中的排序查詢

      預設是升序(asc()可以不用寫:      User.query.order_by(User.id).all()     #  User 是模型類,通過User中的id進行排序

       降序:  desc()   

           User.query.order_by(User.id.desc()).all()       #  直接在要按什麼排序的後面,desc()  的方式,進行降序排序

      (6)  查詢時,group_by 的使用

               如果要 用到聚合函式   則要匯入     

               from sqlalchemy import func

             #   分組統計出  User模型類中 表中的 role_id的每個資料的次數

              db.session.query(User.role_id,func.count(User.role_id)).group_by(User.role_id).all()    # 返回查詢的結果列                表不是資料的物件了

      (7)  關聯查詢

            在模型類裡面添加了relationship(), 關聯了另外一模型類,

           在Role的模型類中,建立了屬性  users = db.relationship("User",backref="role") ,關聯了另外一個User的模型類

                  ( 1)從Role往User裡面查詢

                              ro = Role.query.get(1)  # 獲取到了,Role中的一 個數據物件

                             直接 ro.user  就可以把Role表中的相對應在User中資料物件取出來

                   (2 ) 從User往Role裡面查詢

                              user = User.query.get(1)

                              直接在user.role就可以查詢到Role表中相對應的資料物件

       (8)定義顯示資訊

               在模型類中,重寫   __repr__   方法,  

    def __repr__(self):
        """定義之後,可以讓顯示物件的時候更直觀"""
        return "User object : name=%s" % self.name

 

 db_demp.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)


class Config(object):
    """配置引數"""
    '''sqlalchemy的配置引數'''
    SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://root:[email protected]:3306/db_python"
    '''設定sqlalchemy自動跟蹤資料庫'''
    SQLALCHEMY_TRACK_MODIFICATIONS = True


# 設定引數
app.config.from_object(Config)

'''建立資料庫 sqlalchemy 工具物件'''
db = SQLAlchemy(app)

"""
    建立資料庫模型類(繼承 sqlalchemy 工具物件中的Model類),一個模型類對應一張模型表
    資料庫表名的常見規範:
        (1) 資料庫名縮寫_表名   (2) tbl_表名
"""


class Role(db.Model):
    """使用者身份表"""
    __tablename__ = "tbl_roles"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32), unique=True)
    '''
        relationship() :第一個引數表明這個關係的另一端是哪個模型(類)
           把兩個表關聯在一起,不新增也是可以的,根據自己的需求
        backref : 在關係的另一模型中新增反向引用
                   相當於給要關聯的表新增一個role屬性
                   不新增也是可以的,根據自己的需求 
    '''
    user = db.relationship("User", backref="rpp")  # 從模型類中

    def __repr__(self):
        """定義之後,可以讓顯示物件的時候更直觀"""
        return "Role object : name=%s" % self.name


class User(db.Model):
    """使用者表"""
    __tablename__ = "tbl_users"  # 指明資料庫的表名

    id = db.Column(db.Integer, primary_key=True)  # 整型的主鍵,會預設設定為自增主鍵
    name = db.Column(db.String(64), unique=True)
    email = db.Column(db.String(128), unique=True)
    password = db.Column(db.String(128))
    # db.ForeignKey  外來鍵關聯
    # User類中添加了一個role_id變數,資料型別db.Integer,第二個引數指定外來鍵是哪個表中哪個id。
    role_id = db.Column(db.Integer, db.ForeignKey("tbl_roles.id"))  # 從底層中

    def __repr__(self):
        """定義之後,可以讓顯示物件的時候更直觀"""
        return "User object : name=%s" % self.name


if __name__ == '__main__':
    '''清除資料庫中的所有資料'''
    db.drop_all()
    '''建立所有表'''
    db.create_all()

    # 給使用者身份表中新增兩個資料
    '''建立一個物件'''
    role1 = Role(name="admin")
    '''在Flask-SQLAlchemy中,插入、修改、刪除操作,均由資料庫會話管理。會話用db.session表示'''
    '''session 記錄物件任務 '''
    db.session.add(role1)
    '''提交任務到資料庫中'''
    db.session.commit()

    role2 = Role(name="stuff")
    db.session.add(role2)
    db.session.commit()

    # 給使用者表中新增資料
    us1 = User(name='wang', email='[email protected]', password='123456', role_id=role1.id)
    us2 = User(name='zhang', email='[email protected]', password='452342', role_id=role2.id)
    us3 = User(name='chen', email='[email protected]', password='782677', role_id=role2.id)
    us4 = User(name='zhou', email='[email protected]', password='858585', role_id=role1.id)
    '''一次性新增多條資料'''
    db.session.add_all([us1, us2, us3, us4])
    db.session.commit()

 然後在ipython中匯入py檔案

"""匯入相關的py檔案"""
In [1]: from db_demo import *

In [2]: Role.query.all()
Out[2]: [<Role 1>, <Role 2>]

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

In [4]: li
Out[4]: [<Role 1>, <Role 2>]

In [5]: r = li[0]

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

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

In [8]: Role.query.first()
Out[8]: <Role 1>

In [9]: r.name
Out[9]: 'admin'
"""#  根據主鍵id獲取物件"""
In [10]: r = Role.query.get(2)

In [11]: r
Out[11]: <Role 2>

In [12]: r.name
Out[12]: 'stuff'

"""另一種查詢方式"""
In [13]: db.session.query(Role).all()
Out[13]: [<Role 1>, <Role 2>]

In [14]: db.session.query(Role).get(2)
Out[14]: <Role 2>

In [15]: db.session.query(Role).first()
Out[15]: <Role 1>

In [16]: User.query.filter_by(name="wang")
Out[16]: <flask_sqlalchemy.BaseQuery at 0x276d8975eb8>

In [18]: User.query.filter_by(name="wang").all()
Out[18]: [<User 1>]

In [19]: User.query.filter_by(name="wang").first()
Out[19]: <User 1>

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

In [21]: user.name
Out[21]: 'wang'

In [22]: user.email
Out[22]: '[email protected]'

In [23]: User.query.filter_by(name="wang", role_id=1).first()
Out[23]: <User 1>

In [24]: User.query.filter_by(name="wang", role_id=2).first()
"""沒有該資料時,返回的是空"""
In [25]: user = User.query.filter_by(name="wang", role_id=2).first()

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

In [27]: user = User.query.filter(User.name=="wang", User.role_id==1).first()

In [28]: user
Out[28]: <User 1>

In [29]: user.name
Out[29]: 'wang'

"""模糊查詢"""
In [30]: from sqlalchemy import or_

In [31]: User.query.filter(or_(User.name=="wang", User.email.endswith("163.com"))).all()
Out[31]: [<User 1>, <User 4>]

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

In [33]: li[0].name
Out[33]: 'wang'

In [34]: li[1].name
Out[34]: 'zhou'
"""offset偏移 即跳過幾條"""
In [35]: User.query.offset(2).all()
Out[35]: [<User 3>, <User 4>]

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

In [37]: li[0].name
Out[37]: 'chen'

In [38]: li[1].name
Out[38]: 'zhou'

In [39]: li = User.query.offset(1).limit(2).all()

In [40]: li
Out[40]: [<User 2>, <User 3>]

In [41]: li[0].name
Out[41]: 'zhang'

In [42]: li[1].name
Out[42]: 'chen'
"""排序查詢"""
In [43]: User.query.order_by("id").all()
Out[43]: [<User 1>, <User 2>, <User 3>, <User 4>]

In [44]: li = User.query.order_by(User.id.desc()).all()

In [45]: li
Out[45]: [<User 4>, <User 3>, <User 2>, <User 1>]

In [46]: li[0].name
Out[46]: 'zhou'

In [47]: li[1].name
Out[47]: 'chen'

"""分組查詢"""
In [48]: from sqlalchemy import func

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