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)]