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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Web框架——Flask系列之Flask-SQLAlchemy数据库的基本操作(九)

發布時間:2024/7/5 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web框架——Flask系列之Flask-SQLAlchemy数据库的基本操作(九) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據庫基本操作

  • 在Flask-SQLAlchemy中,插入、修改、刪除操作,均由數據庫會話管理。

會話用 db.session 表示。在準備把數據寫入數據庫前,要先將數據添加到會話中然后調用db.session.commit()方法提交會話。

  • db.session.add(role)添加到數據庫的session中
  • db.session.add_all([user1,user2])添加多個信息到session中
  • db.session.commit()提交數據庫的修改(包括增/刪/改)
  • db.session.rollback()數據庫的回滾操作
  • db.session.delete(user)刪除數據庫(需跟上commit)
    • 在 Flask-SQLAlchemy 中,查詢操作是通過 query 對象操作數據。

    最基本的查詢是返回表中所有數據,可以通過過濾器進行更精確的數據庫查詢。

    一、在視圖函數中定義模型類

    from flask import Flask from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)#設置連接數據庫的URL app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test' #設置數據庫追蹤信息,壓制警告 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True #創建SQLAlchemy對象,讀取app中配置信息 db = SQLAlchemy(app) #定義角色模型(一方) class Role(db.Model):# 定義表名__tablename__ = 'roles'# 定義列對象id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64), unique=True)#設置關系屬性,方便查詢使用us = db.relationship('User', backref='role')#重寫__repr__方法,方便查看對象輸出內容def __repr__(self):return 'Role:%s'% self.name#定義用戶模型類(多方) class User(db.Model):__tablename__ = 'users'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(64), unique=True, index=True)email = db.Column(db.String(64),unique=True)password = db.Column(db.String(64))role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))def __repr__(self):return 'User:%s'%self.name if __name__ == '__main__':#刪除所有和db相關聯的表db.drop_all()#創建所有和db相關聯的表db.create_all()app.run(debug=True)

    二、關鍵代碼格式,說明

    • 一對多關系
    class Role(db.Model):...#關鍵代碼us = db.relationship('User', backref='role', lazy='dynamic')...class User(db.Model):...role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    • 其中realtionship描述了Role和User的關系。
    • 第一個參數為對應參照的類"User"
    • 第二個參數backref為類User,反向引用屬性
    • 第三個參數lazy決定了什么時候SQLALchemy從數據庫中加載數據
  • 如果設置為子查詢方式(subquery),則會在加載完Role對象后,就立即加載與其關聯的對象,這樣會讓總查詢數量減少,但如果返回的條目數量很多,就會比較慢
    設置為 subquery 的話,role.users 返回所有數據列表
  • 另外,也可以設置為動態方式(dynamic),這樣關聯對象會在被使用的時候再進行加載,并且在返回前進行過濾,如果返回的對象數很多,或者未來會變得很多,那最好采用這種方式
  • 三、常見的操作語句

    • db.session.add(obj) 添加對象
    • db.session.add_all([obj1,obj2,…]) 添加多個對象
    • db.session.delete(obj) 刪除對象
    • db.session.commit() 提交會話
    • db.session.rollback() 回滾
    • db.session.remove() 移除會話

    代碼演示:

    往roles表中添加一條記錄:role;往users表中添加、修改、刪除一條記錄:user

    from flask import Flask from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# 數據庫鏈接地址 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1/flask_sql_demo' # 動態追蹤修改設置,如未設置只會提示警告,不建議開啟,未來版本中會移除 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Falsedb = SQLAlchemy(app)''' 兩張表 角色(管理員/普通用戶) 用戶(角色ID) '''# 數據庫的模型,需要繼承db.Model # 角色表 class Role(db.Model):# 定義表名__tablename__ = 'roles'# 定義字段# db.Column表示是一個字段id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(16),unique=True)# 用戶表 class User(db.Model):# 定義表名__tablename__ = 'users'# 定義字段id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(16), unique=True)# db.ForeignKey('roles.id')表示是外鍵,需要傳參數:表名.字段名role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))@app.route('/')def index():return 'Hello flask!'if __name__ == '__main__':# 刪除表db.drop_all()# 創建表db.create_all()# 創建測試數據# 增加數據role = Role(name='admin')db.session.add(role)db.session.commit()user = User(name='Zep',role_id=role.id)db.session.add(user)db.session.commit()# 修改user這條記錄時,不需要再db.session.add(user),因為之前已經add過了,直接commit即可user.name = 'Zep03'db.session.commit()# 刪除user這條記錄db.session.delete(user)db.session.commit()user = User(name='Zep', role_id=role.id)db.session.add(user)db.session.commit()app.run(debug=True)

    運行結果:


    四、常用的SQLAlchemy查詢過濾器

    • 用來過濾數據,返回查詢的結果集
  • 通過filter_by(列名=值,列名=值)的方法來查詢數據:

  • 通過filter(類名.列名值 ,類名.列名值)的方法來查詢數據:

  • 完整使用方法:User.query.filter().offset().limit.order_by().all()
  • offset表示“偏移”,offset(2)表示跳過2條記錄,從第3條開始查


    4. order_by(類名.列名.desc()):按照列名的降序排序

    order_by(類名.列名.asc()):按照列名的升序排序(默認就是按照升序)

    from sqlalchemy import func db.session.query(User.role_id,func.count(User.role_id)).group_by(User.role_id).all()

    五、常用的SQLAlchemy查詢執行器

    • 用來執行結果集,得到具體數據
  • all()方法,以列表的形式返回查詢的所有結果,列表中存放的是一個個對象(一條條記錄):

  • 通過first()和get()方法獲取表中的某一條記錄: 注意:get(主鍵的值),返回指定主鍵對應的行


  • 3. 關聯查詢:通過Role的對象來獲取關聯的字段的列表,ro.users

    4. 關聯查詢通過User的對象來獲取role:

    5. 顯示信息: def repr(self):
    ‘’‘定義之后,可以讓顯示對象的時候更加直觀’’’
    return “User object:name=%s” %self.name

    六、練習數據庫查詢操作

    • 代碼準備
    from flask import Flask from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)#配置信息 app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/basic8" #設置壓制警告信息,如果True會追蹤數據庫變化,會增加顯著開銷,所以建議設置為False app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False#創建SQLAlchemy類對象,關聯app db = SQLAlchemy(app)#編寫模型類,繼承db.Model #角色,用戶之間的關系 class Role(db.Model):__tablename__ = "roles" #指定表名稱#參數1:表示整數類型, 參數2:表示主鍵id = db.Column(db.Integer,primary_key=True)#角色名唯一的name = db.Column(db.String(64),unique=True)#需要設置關系屬性relationship(不會產生字段),設置在一方#給Role添加了users關系屬性, 查詢格式: role.users#給User添加了role關系屬性(反向引用),查詢格式: user.roleusers = db.relationship('User',backref='role')#為了方便的看到對象輸出的內容__repr__, 如果是普通類__str__def __repr__(self):return "<Role:%s>"%self.name# 用戶(多方) class User(db.Model):__tablename__ = "users" # 指定表名稱#參數1:表示整數類型, 參數2:表示主鍵id = db.Column(db.Integer,primary_key=True)#用戶名唯一的name = db.Column(db.String(64),unique=True)#郵箱密碼email = db.Column(db.String(64),unique=True)password = db.Column(db.String(64))#外鍵role_id = db.Column(db.Integer,db.ForeignKey(Role.id))#為了方便的看到對象輸出的內容__repr__, 如果是普通類__str__def __repr__(self):return "<User:%s,%s,%s,%s>"%(self.id,self.name,self.email,self.password)if __name__ == '__main__':#為了演示方便,先刪除數據庫表,和模型類關聯的表db.drop_all()#創建表,所有繼承自dbModel的表db.create_all()#創建測試數據ro1 = Role(name='admin')db.session.add(ro1)db.session.commit()# 再次插入一條數據ro2 = Role(name='user')db.session.add(ro2)db.session.commit()#多條用戶數據us1 = User(name='wang', email='wang@163.com', password='123456', role_id=ro1.id)us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=ro2.id)us3 = User(name='chen', email='chen@126.com', password='987654', role_id=ro2.id)us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=ro1.id)us5 = User(name='tang', email='tang@itheima.com', password='158104', role_id=ro2.id)us6 = User(name='wu', email='wu@gmail.com', password='5623514', role_id=ro2.id)us7 = User(name='qian', email='qian@gmail.com', password='1543567', role_id=ro1.id)us8 = User(name='liu', email='liu@itheima.com', password='867322', role_id=ro1.id)us9 = User(name='li', email='li@163.com', password='4526342', role_id=ro2.id)us10 = User(name='sun', email='sun@163.com', password='235523', role_id=ro2.id)db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])db.session.commit()app.run(debug=True)

    • 需求: 編寫方法,查詢以下內容
  • 查詢所有用戶數據
  • 查詢有多少個用戶
  • 查詢第1個用戶
  • 查詢id為4的用戶[3種方式]
  • 查詢名字結尾字符為g的所有數據[開始/包含]
  • 查詢名字不等于wang的所有數據[2種方式]
  • 查詢名字和郵箱都以 li 開頭的所有數據[2種方式]
  • 查詢password是 123456 或者 email 以 itheima.com 結尾的所有數據
  • 查詢id為 [1, 3, 5, 7, 9] 的用戶列表
  • 查詢name為liu的角色數據
  • 查詢所有用戶數據,并以郵箱排序
  • 每頁3個,查詢第2頁的數據
  • 七、代碼參考

    查詢:filter_by精確查詢
    返回名字等于wang的所有人

    User.query.filter_by(name='wang').all()

  • first()返回查詢到的第一個對象
  • User.query.first()
  • all()返回查詢到的所有對象
  • User.query.all()


    3. filter模糊查詢,返回名字結尾字符為g的所有數據。

    User.query.filter(User.name.endswith('g')).all()


    4. get():參數為主鍵,如果主鍵不存在沒有返回內容

    User.query.get()
  • 邏輯非,返回名字不等于wang的所有數據
  • User.query.filter(User.name!='wang').all()


    6. not_ 相當于取反

    from sqlalchemy import not_ User.query.filter(not_(User.name=='chen')).all()


    7. 邏輯與,需要導入and,返回and()條件滿足的所有數據

    from sqlalchemy import and_ User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()


    8. 邏輯或,需要導入or_

    from sqlalchemy import or_ User.query.filter(or_(User.name!='wang',User.email.endswith('163.com'))).all()


    9. 查詢數據后刪除

    user = User.query.first() db.session.delete(user) db.session.commit() User.query.all()


    10. 更新數據

    user = User.query.first() user.name = 'dong' db.session.commit() User.query.first()



    關聯查詢示例:

    角色和用戶的關系是一對多的關系,一個角色可以有多個用戶,一個用戶只能屬于一個角色。

    • 查詢角色的所有用戶
    #查詢roles表id為1的角色 ro1 = Role.query.get(1) #查詢該角色的所有用戶 ro1.us.all()

    • 查詢用戶所屬角色
    #查詢users表id為3的用戶 us1 = User.query.get(3) #查詢用戶屬于什么角色 us1.role

    總結

    以上是生活随笔為你收集整理的Web框架——Flask系列之Flask-SQLAlchemy数据库的基本操作(九)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。