• 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(),
    第一个参数为中间表的表名,然后在表中添加两个字段,这两个字段分别为关联的两个表的一对多的外键,也同为主键。
  • 相关阅读:
    用标签替换的方法生成静态网页
    SQL Server 索引结构及其使用(三、四)(转载)
    SQL server 2000异地备份
    GridView加自动编号列
    SQL Server 索引结构及其使用(一、二)(转载)
    DropDownTreeList
    SQL函数——将一对多关系转换成一对一关系
    动态sql语句基本语法
    kalilinux MSF数据库的连接
    Linux sudo权限绕过(CVE201914287)
  • 原文地址:https://www.cnblogs.com/wangcuican/p/13178010.html
Copyright © 2020-2023  润新知