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 SQLAlchemyapp = Flask(__name__)class Config(object):"""配置參數"""'''sqlalchemy的配置參數'''SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://root:123456@127.0.0.1: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.nameclass 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.nameif __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='wang@163.com', password='123456', role_id=role1.id)us2 = User(name='zhang', email='zhang@189.com', password='452342', role_id=role2.id)us3 = User(name='chen', email='chen@126.com', password='782677', role_id=role2.id)us4 = User(name='zhou', email='zhou@163.com', 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.RoleIn [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]: 'wang@163.com'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]: NoneTypeIn [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 funcIn [49]: db.session.query(User.role_id, func.count(User.role_id)).group_by(User.role_id).all() Out[49]: [(1, 2), (2, 2)]?
總結
以上是生活随笔為你收集整理的Flask框架(SQLAlchemy(python3版本)中查询数据的方法,以及定义显示信息 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flask框架(flask中的数据库SQ
- 下一篇: Flask框架(SQLAlchemy(p