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(),
第一个参数为中间表的表名,然后在表中添加两个字段,这两个字段分别为关联的两个表的一对多的外键,也同为主键。

 

posted @ 2020-06-22 17:40  只会玩辅助  阅读(1364)  评论(0编辑  收藏  举报