Web框架——Flask系列之Flask-SQLAlchemy数据库的基本操作(九)
數據庫基本操作
- 在Flask-SQLAlchemy中,插入、修改、刪除操作,均由數據庫會話管理。
會話用 db.session 表示。在準備把數據寫入數據庫前,要先將數據添加到會話中然后調用db.session.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)二、關鍵代碼格式,說明
- 一對多關系
- 其中realtionship描述了Role和User的關系。
- 第一個參數為對應參照的類"User"
- 第二個參數backref為類User,反向引用屬性
- 第三個參數lazy決定了什么時候SQLALchemy從數據庫中加載數據
設置為 subquery 的話,role.users 返回所有數據列表
三、常見的操作語句
- 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查詢過濾器
- 用來過濾數據,返回查詢的結果集
offset表示“偏移”,offset(2)表示跳過2條記錄,從第3條開始查
4. order_by(類名.列名.desc()):按照列名的降序排序
order_by(類名.列名.asc()):按照列名的升序排序(默認就是按照升序)
五、常用的SQLAlchemy查詢執行器
- 用來執行結果集,得到具體數據
3. 關聯查詢:通過Role的對象來獲取關聯的字段的列表,ro.users
4. 關聯查詢通過User的對象來獲取role:
5. 顯示信息: def repr(self):
‘’‘定義之后,可以讓顯示對象的時候更加直觀’’’
return “User object:name=%s” %self.name
六、練習數據庫查詢操作
- 代碼準備
- 需求: 編寫方法,查詢以下內容
七、代碼參考
查詢:filter_by精確查詢
返回名字等于wang的所有人
3. filter模糊查詢,返回名字結尾字符為g的所有數據。
4. get():參數為主鍵,如果主鍵不存在沒有返回內容
6. not_ 相當于取反
7. 邏輯與,需要導入and,返回and()條件滿足的所有數據
8. 邏輯或,需要導入or_
9. 查詢數據后刪除
10. 更新數據
關聯查詢示例:
角色和用戶的關系是一對多的關系,一個角色可以有多個用戶,一個用戶只能屬于一個角色。
- 查詢角色的所有用戶
- 查詢用戶所屬角色
總結
以上是生活随笔為你收集整理的Web框架——Flask系列之Flask-SQLAlchemy数据库的基本操作(九)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web框架——Flask系列之Flask
- 下一篇: 微信可以远程控制电脑吗_用微信就能远程控