一對多。例如,班級與學(xué)生,一個(gè)班級對應(yīng)多個(gè)學(xué)生,或者多個(gè)學(xué)生對應(yīng)一個(gè)班級。 多對多。例如,學(xué)生與課程,可以有多個(gè)學(xué)生修同一門課,同時(shí),一門課也有很多學(xué)生。
如果一個(gè)項(xiàng)目,有兩張表。分別是班級表,學(xué)生表。 在設(shè)計(jì)數(shù)據(jù)表時(shí),我們給學(xué)生表設(shè)置一個(gè)外鍵,指向班級表的 id 。 sqlalchemy 模板創(chuàng)建表的代碼:
1 from flask import Flask, render_template, request, flash, redirect 2 from flask_sqlalchemy import SQLAlchemy 3 4 app = Flask(__name__,static_folder="static",template_folder="templates") 5 6 # 設(shè)置數(shù)據(jù)庫連接屬性 7 app.config['SQLALCHEMY_DATABASE_URI'] = '×××' 8 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 9 10 # 實(shí)例化 ORM 操作對象 11 db = SQLAlchemy(app) 12 13 # 班級表 14 class Classes(db.Model): 15 __tablename__ = "classes" 16 id = db.Column(db.Integer,primary_key=True) 17 name = db.Column(db.String(20),nullable=False,unique=True) 18 19 # 學(xué)生表 20 class Students(db.Model): 21 __tablename__ = "students" 22 id = db.Column(db.Integer,primary_key=True) 23 name = db.Column(db.String(40),nullable=False) 24 cls_id = db.Column(db.Integer,db.ForeignKey("classes.id")) # 注意要寫成(表名.字段名) 創(chuàng)建完表,插入完數(shù)據(jù)后。 如果我們知道學(xué)生的學(xué)號,要查學(xué)生班級的名稱,應(yīng)該怎么操作呢? 現(xiàn)在可以用一種比較麻煩的方達(dá)查詢: cls_id = Students.query.filter(Student.id == 'xxx').first() cls = Classes.query.filter(Classes.id == cls.id).first() print(cls.name) 這樣的方法太麻煩了,有沒有簡單的辦法? 上面創(chuàng)建表的代碼,在18行可以插入一條語句。 relate_student = db.relationship("Students",backref='relate_class',lazy='dynamic')
如果一大堆理論看不明白,那么知道怎么用就可以了。 如果知道學(xué)生的姓名,想知道班級的名稱,可以這樣查: stu = Students.query.filter(Students.name == 'xxx').first() stu.relate_class.name # stu.relate_class 會跳到 classes 表 如果知道班級的名稱,想返回全部學(xué)生的名字的列表,可以這樣查: cls = Classes.query.filter(Classes.name == 'xxx').first() cls.relate_student.name # cls.relate_stu 會跳到 students 表 可以使用這樣的方法,有兩個(gè)要求,第一是要設(shè)置外鍵,第二是這句語句: relate_student = db.relationship("Students",backref='relate_class',lazy='dynamic') 注意,什么時(shí)候用 relate_student ,什么時(shí)候用 relate_class 。以及 relationship 這條語句的書寫,要清楚!
假設(shè)一堆學(xué)生選了不同的課程,這就是多對多關(guān)系。 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) 添加測試數(shù)據(jù): # 添加測試數(shù)據(jù) stu1 = Student(name='張三') stu2 = Student(name='李四') stu3 = Student(name='王五') cou1 = Course(name='物理') cou2 = Course(name='化學(xué)') cou3 = Course(name='生物') stu1.courses = [cou2, cou3] # 記得要添加關(guān)系 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() 要查某個(gè)學(xué)生修的全部課程,修了某個(gè)課程的全部學(xué)生: for course in stu1.relate_courses: print(course.name) for student in cou2.relate_student: print(student)
|
|