flask資料庫之多對多模型演練
阿新 • • 發佈:2019-02-04
多對多演練
在專案開發過程中,會遇到很多資料之間多對多關係的情況,比如:
- 學生網上選課(學生和課程)
- 老師與其授課的班級(老師和班級)
- 使用者與其收藏的新聞(使用者和新聞)
- 等等...
所以在開發過程中需要使用 ORM 模型將表與表的多對多關聯關係使用程式碼描述出來。多對多關係描述有一個唯一的點就是:需要新增一張單獨的表去記錄兩張表之間的對應關係
場景示例
需求分析
- 學生可以網上選課,學生有多個,課程也有多個
- 學生有:張三、李四、王五
- 課程有:物理、化學、生物
- 選修關係有:
- 張三選修了化學和生物
- 李四選修了化學
- 王五選修了物理、化學和生物
- 需求:
- 查詢某個學生選修了哪些課程
- 查詢某個課程都有哪些學生選擇
思路分析
- 可以通過分析得出
- 用一張表來儲存所有的學生資料
- 用一張表來儲存所有的課程資料
- 具體表及測試資料可以如下:
學生表(Student)
主鍵(id) | 學生名(name) |
---|---|
1 | 張三 |
2 | 李四 |
3 | 王五 |
選修課表(Course)
主鍵(id) | 課程名(name) |
---|---|
1 | 物理 |
2 | 化學 |
3 | 生物 |
資料關聯關係表(Student_Course)
主鍵(student.id) | 主鍵(course.id) |
---|---|
1 | 2 |
1 | 3 |
2 | 2 |
3 | 1 |
3 | 2 |
3 | 3 |
結果
查詢某個學生選修了哪些課程,例如:查詢王五選修了哪些課程
- 取出王五的 id 去 Student_Course 表中查詢 student.id 值為 3 的所有資料
- 查詢出來有3條資料,然後將這3條資料裡面的 course.id 取值並查詢 Course 表即可獲得結果
查詢某個課程都有哪些學生選擇,例如:查詢生物課程都有哪些學生選修
- 取出生物課程的 id 去 Student_Course 表中查詢 course.id 值為 3 的所有資料
- 查詢出來有2條資料,然後將這2條資料裡面的 student.id 取值並查詢 Student 表即可獲得結果
程式碼演練
- 定義模型及表
tb_student_course = db.Table('tb_student_course',
db.Column('student_id', db.Integer, db.ForeignKey('students.id')),
db.Column('course_id' , db.Integer, db.ForeignKey('courses.id'))
)
class Student(db.Model):
__tablename__ = "students"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
courses = db.relationship('Course', secondary=tb_student_course,
backref='student',
lazy='dynamic')
class Course(db.Model):
__tablename__ = "courses"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
- 新增測試資料
if __name__ == '__main__':
db.drop_all()
db.create_all()
# 新增測試資料
stu1 = Student(name='張三')
stu2 = Student(name='李四')
stu3 = Student(name='王五')
cou1 = Course(name='物理')
cou2 = Course(name='化學')
cou3 = Course(name='生物')
stu1.courses = [cou2, cou3]
stu2.courses = [cou2]
stu3.courses = [cou1, cou2, cou3]
db.session.add_all([stu1, stu2, stu2])
db.session.add_all([cou1, cou2, cou3])
db.session.commit()
app.run(debug=True)