Flask复习(数据库模型常用字段类型/Column常用列表项/常用关系选项)、数据关系(一对多关系、一对一关系、多对多关系)
一、常用字段类型 (注意:SQLAlchemy没有Double)
注意:String在使用的时候需要指定长度
class User(db.Model): __tablename__ = 'user' #设置表名 id = Column(db.Integer, primary_key=True) username = Column(db.String(50)) password = Column(db.String(50))
二、Column常用列表项
server_default
示例:
class Post(db.Model): __tablename__ = "post" id = Column(db.Integer, primary_key=True) author_id = Column(db.Integer) created = Column(db.TIMESTAMP) title = Column(db.String(50)) body = Column(db.Text) has_edited = Column(db.Boolean) last_modify_time = Column(db.TIMESTAMP)
三、常用关系选项
四、一对多关系 参考链接:https://www.cnblogs.com/huchong/p/8797516.html#_label1
班级表和学生表(一对多关系)
# 班级表 (一的一方) class Classes(db.Model): __tablename__ = "classes" id = db.Column(db.Integer,primary_key=True) name = db.Column(db.String(20),nullable=False,unique=True) #第一个参数为对应参照的类"Students",第二个参数brckref为类Students申明新属性的方法,第三个参数可以设置也可以不设置 relate_student = db.relationship("Students",backref='relate_class',lazy='dynamic') #该字段不会作为字段写入数据库中 # 学生表 (多的一方) class Students(db.Model): __tablename__ = "students" id = db.Column(db.Integer,primary_key=True) name = db.Column(db.String(40),nullable=False) #设置外键Foreignkey,该字段会出现在数据库中 cls_id = db.Column(db.Integer,db.ForeignKey("classes.id")) # 注意要写成(表名.字段名)
查询示例:
如果知道学生的姓名,想知道班级的姓名,可以这样查
stu = Students.query.filter(Student.name == "XXX").first() #获取班级名 stu.relate_class会跳到 Classes表 class_name = stu.relate_class.name
如果知道班级的名称,想返回全部学生的名字的列表
cls = Classes.query.filter(Classes.name == "xxx").first() #获取student_name cls.relate_student 会跳到student表 student_name = cls.relate_student.name
注意:什么时候用 relate_student ,什么时候用 relate_class 。以及 relationship 这条语句的书写,要清楚!
总结:
其中realtionship描述了Students和Classes的关系。在此文中,第一个参数为对应参照的类"Students"
第二个参数backref为类Students申明新属性的方法
第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据
如果设置为子查询方式(subquery),则会在加载完Classes对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢
另外,也可以设置为动态方式(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式
参考链接:https://www.cnblogs.com/chichung/p/9794850.html
参考链接:https://www.cnblogs.com/xiaxiaoxu/p/10597561.html
relationship()提供了Classes对Students的访问,而backref正好相反,提供了Students对Classes的访问
五、一对一关系
一对一需要设置relationship中的uselist=False,其他操作都一样
class User(db.Model): __tablename__= 'user' id= db.Column(db.Integer,primary_key=True) name= db.Column(db.String(200)) card= db.relationship('Card',uselist=False,backref="user") class Card(db.Model): __tablename__= 'card' id= db.Column(db.Integer,primary_key=True) cardnum= db.Column(db.String(200)) user_id= db.Column(db.Integer,db.ForeignKey('user.id'))
六、多对多关系
创建学生表
class Students(db.Model): __tablename__ = 'students' id = db.Column(db.Integer,primary_key=True) name = db.Column(db.String(64),unique=True)
#关联属性,多对多的情况,可以写在任意一个模型类中
relate_course = db.relationship('Course',
secondary=tb_student_course,
backref="relate_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)
创建的中间表
# 多对多模型需要添加一张单独的表去记录两张表之间的对应关系 tb_student_course = db.Table('tb_student_course', db.Column('student_id', db.Integer, db.ForeignKey('students.id'),primary_key=True), db.Column('course_id', db.Integer, db.ForeignKey('courses.id'),primary_key=True) ) #db.Column是设置列名,db.Foreignkey设置外键
代码示例:
# 添加测试数据 stu1 = Student(name='张三') stu2 = Student(name='李四') stu3 = Student(name='王五') cou1 = Course(name='物理') cou2 = Course(name='化学') cou3 = Course(name='生物') stu1.relate_course= [cou2, cou3] # 记得要添加关系 stu2.relate_course= [cou2] stu3.relate_course= [cou1, cou2, cou3] db.session.add_all([stu1, stu2, stu2]) db.session.add_all([cou1, cou2, cou3]) db.session.commit()
要查某个学生修的全部课程,修了某个课程的全部学生:
for course in stu1.relate_courses: print(course.name) for student in cou2.relate_student: print(student)
多对多关系总结
1.多对多可以在任意一方中添加一个relationship字段,
第一个参数为关联的另外一个表,第二个参数为中间表的表名,第三个参数backref是反向查询时的关键字。
2.在flask中多对多的中间表需要自己建立。建立的中间表的类为db.Table(),
第一个参数为中间表的表名,然后在表中添加两个字段,这两个字段分别为关联的两个表的一对多的外键,也同为主键。