日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Flask框架(SQLAlchemy(python3版本)中查询数据的方法,以及定义显示信息 )

發(fā)布時(shí)間:2024/9/30 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask框架(SQLAlchemy(python3版本)中查询数据的方法,以及定义显示信息 ) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

(SQLAlchemy中添加數(shù)據(jù) )https://blog.csdn.net/wei18791957243/article/details/85256848?

? ? 添加數(shù)據(jù),添加好的表

? ? ?

SQlalchemy數(shù)據(jù)庫(kù)查詢

1. 查詢數(shù)據(jù)

? ? ?(1) 查詢表中的所有數(shù)據(jù):? ? 模型類.query.all()? ? # 返回每個(gè)數(shù)據(jù)的對(duì)象的列表

? ? ? ? ? ?例如:? ?li = Role.query.all()? ? # 保存的是數(shù)據(jù)的對(duì)象,列表形式? ? ? Role 是一個(gè)模型類

? ? ? ? ? ? ? ? ? ? ? ? ? li[0]? ?#? ?取第一個(gè)數(shù)據(jù)對(duì)象

? ? ? ? ? ? ? ? ? ? ? ? li[0].name? ?# 就取出了第一個(gè)數(shù)據(jù)對(duì)象的name屬性,即在數(shù)據(jù)庫(kù)中的列名為name的第一個(gè)值

? ? (2)查詢第一條數(shù)據(jù):

? ? ? ? ? ? ? ?r = Role.query.first()? ? ?#? ?查詢到第一個(gè)條數(shù)據(jù)的對(duì)象

? ? ? ? ? ? ? ?r.name? ? ? ? ? ? ? ? ?#? 然后取出相應(yīng)的值

? ? ? ? ? ? ? 還有一種方法:? 按照主鍵的值來(lái)進(jìn)行查詢一條數(shù)據(jù)

? ? ? ? ? ? ??r = Role.query.get(2)? ? ? ? ? ?#? ? 2? 即查詢出主鍵為2? 的那條數(shù)據(jù)的對(duì)象

? ? ? ? ? ? ? r.name? ???#? 然后取出相應(yīng)的值

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

? ? ? ? ? 查詢多條

? ? ? ? ? ? ? ?db.session.query(模型類).all()? ? ? ? ?#?返回的是一個(gè)數(shù)據(jù)對(duì)象列表? ?、

? ? ? ? ?查詢第一條

? ? ? ? ? ? ? ?db.session.query(模型類).first()? ? ? ? ?#?返回的是第一個(gè)數(shù)據(jù)對(duì)象

? ? ? ? ?查詢其中的一條

? ? ? ? ? ??db.session.query(模型類).get(主鍵的值)? ? ? ? ?#?返回的是一個(gè)數(shù)據(jù)對(duì)象

? ? 2.? ?查詢數(shù)據(jù)的時(shí)候進(jìn)行過(guò)濾

? ? ? ?(1)? 模型類.query_filter_by(name="wang").all? ?# 查詢出name為wang的數(shù)據(jù)對(duì)象,返回的是一個(gè)列表,然后可以根? ? ? ? ? ? ? ? ? ? 據(jù)屬性來(lái)獲取相應(yīng)的值? ? ? ? ? ? ? ? ?也可以.first()??

? ? ? ? ? ? ? ?如果還有其他的條件,直接以逗號(hào)分隔在filter_by()里面添加就行

? ? ? ? ? ? ? 如果查詢的數(shù)據(jù)不存在返回None

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

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

? ? ? ? ? ? ? ? ? ?導(dǎo)入模塊? :? from sqlalchemy import or_

? ? ? ? ? ? ? ? ?#? ?如下:? ?查詢出 User模型類中的name屬性等于“wang”或者email屬性是以163.com結(jié)尾的數(shù)據(jù)對(duì)象

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

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

? ? ? ? ?User.query.offset(2).limit(2).all? ? ?#? ?查詢,從表中第二條數(shù)據(jù)開始查詢,查詢出的結(jié)果取兩個(gè),返回?cái)?shù)據(jù)對(duì)象列表

? ? ? ?可以一起用,也可分開來(lái)用

? ? ?(5) flask中的排序查詢

? ? ??默認(rèn)是升序(asc()可以不用寫:? ? ? User.query.order_by(User.id).all()? ? ?#? User 是模型類,通過(guò)User中的id進(jìn)行排序

? ? ? ?降序:? desc()? ?

? ? ? ? ? ?User.query.order_by(User.id.desc()).all()? ? ? ?#? 直接在要按什么排序的后面,desc()? 的方式,進(jìn)行降序排序

? ? ? (6)? 查詢時(shí),group_by 的使用

? ? ? ? ? ? ? ?如果要 用到聚合函數(shù)? ?則要導(dǎo)入? ? ?

? ? ? ? ? ? ? ?from sqlalchemy import func

? ? ? ? ? ? ?#? ?分組統(tǒng)計(jì)出? User模型類中?表中的 role_id的每個(gè)數(shù)據(jù)的次數(shù)

? ? ? ? ? ? ??db.session.query(User.role_id,func.count(User.role_id)).group_by(User.role_id).all()? ? # 返回查詢的結(jié)果列? ? ? ? ? ? ? ? 表不是數(shù)據(jù)的對(duì)象了

? ? ? (7)? 關(guān)聯(lián)查詢

? ? ? ? ? ??在模型類里面添加了relationship(), 關(guān)聯(lián)了另外一模型類,

? ? ? ? ? ?在Role的模型類中,創(chuàng)建了屬性? users = db.relationship("User",backref="role") ,關(guān)聯(lián)了另外一個(gè)User的模型類

? ? ? ? ? ? ? ? ? ( 1)從Role往User里面查詢

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ro = Role.query.get(1)? # 獲取到了,Role中的一 個(gè)數(shù)據(jù)對(duì)象

? ? ? ? ? ? ? ? ? ? ? ? ? ?? 直接 ro.user? 就可以把Role表中的相對(duì)應(yīng)在User中數(shù)據(jù)對(duì)象取出來(lái)

? ? ? ? ? ? ? ? ? ?(2 ) 從User往Role里面查詢

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? user = User.query.get(1)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 直接在user.role就可以查詢到Role表中相對(duì)應(yīng)的數(shù)據(jù)對(duì)象

? ? ? ?(8)定義顯示信息

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

def __repr__(self):"""定義之后,可以讓顯示對(duì)象的時(shí)候更直觀"""return "User object : name=%s" % self.name

?

?db_demp.py

from flask import Flask from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)class Config(object):"""配置參數(shù)"""'''sqlalchemy的配置參數(shù)'''SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://root:123456@127.0.0.1:3306/db_python"'''設(shè)置sqlalchemy自動(dòng)跟蹤數(shù)據(jù)庫(kù)'''SQLALCHEMY_TRACK_MODIFICATIONS = True# 設(shè)置參數(shù) app.config.from_object(Config)'''創(chuàng)建數(shù)據(jù)庫(kù) sqlalchemy 工具對(duì)象''' db = SQLAlchemy(app)"""創(chuàng)建數(shù)據(jù)庫(kù)模型類(繼承 sqlalchemy 工具對(duì)象中的Model類),一個(gè)模型類對(duì)應(yīng)一張模型表數(shù)據(jù)庫(kù)表名的常見規(guī)范:(1) 數(shù)據(jù)庫(kù)名縮寫_表名 (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() :第一個(gè)參數(shù)表明這個(gè)關(guān)系的另一端是哪個(gè)模型(類)把兩個(gè)表關(guān)聯(lián)在一起,不添加也是可以的,根據(jù)自己的需求backref : 在關(guān)系的另一模型中添加反向引用相當(dāng)于給要關(guān)聯(lián)的表添加一個(gè)role屬性不添加也是可以的,根據(jù)自己的需求 '''user = db.relationship("User", backref="rpp") # 從模型類中def __repr__(self):"""定義之后,可以讓顯示對(duì)象的時(shí)候更直觀"""return "Role object : name=%s" % self.nameclass User(db.Model):"""用戶表"""__tablename__ = "tbl_users" # 指明數(shù)據(jù)庫(kù)的表名id = db.Column(db.Integer, primary_key=True) # 整型的主鍵,會(huì)默認(rèn)設(shè)置為自增主鍵name = db.Column(db.String(64), unique=True)email = db.Column(db.String(128), unique=True)password = db.Column(db.String(128))# db.ForeignKey 外鍵關(guān)聯(lián)# User類中添加了一個(gè)role_id變量,數(shù)據(jù)類型db.Integer,第二個(gè)參數(shù)指定外鍵是哪個(gè)表中哪個(gè)id。role_id = db.Column(db.Integer, db.ForeignKey("tbl_roles.id")) # 從底層中def __repr__(self):"""定義之后,可以讓顯示對(duì)象的時(shí)候更直觀"""return "User object : name=%s" % self.nameif __name__ == '__main__':'''清除數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)'''db.drop_all()'''創(chuàng)建所有表'''db.create_all()# 給用戶身份表中添加兩個(gè)數(shù)據(jù)'''創(chuàng)建一個(gè)對(duì)象'''role1 = Role(name="admin")'''在Flask-SQLAlchemy中,插入、修改、刪除操作,均由數(shù)據(jù)庫(kù)會(huì)話管理。會(huì)話用db.session表示''''''session 記錄對(duì)象任務(wù) '''db.session.add(role1)'''提交任務(wù)到數(shù)據(jù)庫(kù)中'''db.session.commit()role2 = Role(name="stuff")db.session.add(role2)db.session.commit()# 給用戶表中添加數(shù)據(jù)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)'''一次性添加多條數(shù)據(jù)'''db.session.add_all([us1, us2, us3, us4])db.session.commit()

?然后在ipython中導(dǎo)入py文件

"""導(dǎo)入相關(guān)的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' """# 根據(jù)主鍵id獲取對(duì)象""" 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() """沒有該數(shù)據(jù)時(shí),返回的是空""" 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偏移 即跳過(guò)幾條""" 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)]

?

總結(jié)

以上是生活随笔為你收集整理的Flask框架(SQLAlchemy(python3版本)中查询数据的方法,以及定义显示信息 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。