flask資料庫
阿新 • • 發佈:2020-11-28
-
一對多關係
- 多表關係中, 通過
外來鍵
來關聯資料 - 一對多關係中, 外來鍵設定在
多的一方
- 多表關係中, 通過
-
通過關係屬性來關係/查詢資料 操作簡單
- 1> 需要定義外來鍵
- 2> 定義關係屬性
- 3> 使用關係屬性來關聯資料
# 使用者表 一個使用者有多個地址 一 class User(db.Model): __tablename__ = "users" # 設定表名 表名預設為類名的小寫 id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) # 建立關係屬性 relationship("關聯的類名", backref="對方表查詢關聯資料時的屬性名") addresses = db.relationship("Address", backref="user") # 地址表 多 class Address(db.Model): __tablename__ = "addresses" # 設定表名 表名預設為類名的小寫 id = db.Column(db.Integer, primary_key=True) detail = db.Column(db.String(64), unique=True) # 設定外來鍵(一般記錄的是另一張表的主鍵) user_id = db.Column(db.Integer, db.ForeignKey("users.id")) @app.route('/') def index(): # 刪除 所有繼承自db.Model的表 db.drop_all() # 建立 所有的繼承自db.Model的表 db.create_all() """只通過外來鍵來關聯/查詢資料 操作複雜""" # # 新增使用者 # user = User(name="zs") # db.session.add(user) # db.session.commit() # 必須先提交, 否則沒有生成主鍵, 設定外來鍵無效 # # # 新增地址 # adr1 = Address(detail="中關村1號", user_id=user.id) # adr2 = Address(detail="陸家嘴1號", user_id=user.id) # db.session.add_all([adr1, adr2]) # db.session.commit() # # # 查詢資料 根據使用者查詢地址 # adrs = Address.query.filter_by(user_id=user.id).all() # for adr in adrs: # print(adr.detail) """通過關係屬性來關係/查詢資料 操作簡單 1> 仍需要定義外來鍵 2> 定義關係屬性 3> 使用關係屬性來關聯資料""" user = User(name="zs") adr1 = Address(detail="中關村1號", user_id=user.id) adr2 = Address(detail="陸家嘴1號", user_id=user.id) # 關聯資料 # user.addresses = [adr1, adr2] user.addresses.append(adr1) user.addresses.append(adr2) # 新增到資料庫中 db.session.add_all([user, adr1, adr2]) db.session.commit() # 使用關係屬性來查詢資料 print(user.addresses) print(adr1.user) return 'index'
多對多關係
- 多對多關係中, 必須建立獨立的關係表來關聯資料
- 多對多中, 通過關係屬性來關連/查詢資料
- 1> 定義
關係表
來設定外來鍵 - 2> 定義關係屬性
多對多關係屬性, 還需要設定引數secondary="關係表名"
- 3> 使用關係屬性來關聯資料
- 1> 定義
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 設定資料庫連線地址 app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:[email protected]:3306/test18" # 是否追蹤資料庫修改 很消耗效能, 不建議使用 app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False # 設定在控制檯顯示底層執行的SQL語句 app.config["SQLALCHEMY_ECHO"] = False # 建立資料庫連線 db = SQLAlchemy(app) # 建立關係表 多對多關係必須建立單獨的表來記錄關聯資料 t_stu_cur = db.Table("table_stu_cur", db.Column("stu_id", db.Integer, db.ForeignKey("students.id"), primary_key=True), db.Column("cur_id", db.Integer, db.ForeignKey("courses.id"), primary_key=True) ) # 學生表 多 一個學生可以選多門課, 一門課也可以被多個學生選 class Student(db.Model): __tablename__ = "students" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) # 多對多關係屬性, 還需要設定引數secondary="關係表名" courses = db.relationship("Course", backref="students", secondary="table_stu_cur") # 課程表 多 class Course(db.Model): __tablename__ = "courses" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) @app.route('/') def index(): # 刪除 所有繼承自db.Model的表 db.drop_all() # 建立 所有的繼承自db.Model的表 db.create_all() """多對多 通過關係屬性來關連/查詢資料 操作簡單 1> 定義關係表來設定外來鍵 2> 定義關係屬性 3> 使用關係屬性來關聯資料""" stu1 = Student(name="zs") stu2 = Student(name="ls") cur1 = Course(name="python") cur2 = Course(name="c") cur3 = Course(name="java") # 關聯資料 stu1.courses.append(cur1) stu1.courses.append(cur2) stu2.courses.append(cur2) stu2.courses.append(cur3) # 新增到資料庫 db.session.add_all([stu1, stu2, cur1, cur2, cur3]) db.session.commit() print(stu1.courses) print(cur2.students) return 'index' if __name__ == '__main__': app.run(debug=True)