zoukankan      html  css  js  c++  java
  • Flask 对象关系

     建立一个关系

    from sqlalchemy import Column, Integer, String, MetaData, ForeignKey
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship, backref
    metadata = MetaData()
    Base = declarative_base(metadata=metadata)
    
    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String)
        password = Column(String)
        def __repr__(self):
            return "<User(name='%s', password='%s')>" % (self.name, self.password)

     第二个表Address与User关联,可以被映射和查询。Users 在可以存储任意数量的电子邮件地址关联的用户名。这意味着一个从users到一个存储电子邮件地址的新表Addresses一对多关联。我们在Address中使用声明定义这张表与User的映射: 

    class Address(Base):
        __tablename__ = 'addresses'
        id = Column(Integer, primary_key=True)
        email_address = Column(String, nullable=False)
        #ForeignKey函数是一个应用于Column的指令,表明这一列的值应该保存指定名称的远程列的值。
        user_id = Column(Integer, ForeignKey('users.id'))
        user = relationship("User", backref='addresses', lazy='dynamic')
        def __repr__(self):
            return "<Address(email_address='%s')>" % (self.email_address)
        # 第一个参数为对应参照的类User,第二个参数backref表示给关联的数据库模型添加一个属性
        # 第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据。
        # relationship()的参数中有一个称为backref()的relationship()的子函数,反向提供详细的信息,
        # 即在users中添加User对应的Address对象的集合,保存在User.addresses中。

    上述类使用了ForeignKey函数,它是一个应用于Column的指令,表明这一列的值应该保存指定名称的远程列的值。这是关系数据库的一个核心特征,是“胶水”,将原本无关的表变为有丰富的重叠关系的集合。上面的ForeignKey表示,Addresses.user_id列的值应该等于users.id列中的值,即,users的主键。

    第二个函数,称为relationship(), 它告诉 ORM ,Address类本身应该使用属性Address.user链接到User类。relationship()使用两个表之间的外键关系来确定这个链接的性质,这个例子中,确定Address.user将要成为多对一中多的一侧。relationship()的参数中有一个称为backref()relationship()的子函数,反向提供详细的信息, 即在users中添加User对应的Address对象的集合,保存在User.addresses中。多对一关系的反向始终是一对多的关系。一个完整的可用的relationship()配置目录在基本关系模式

    两个互补关系, Address.userUser.addresses被称为一个双向关系,并且这是SQLAlchemy ORM的一个关键特性

    #models.py
    
    class Role(db.Model):
        __tablename__ = 'roles'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64), unique=True)
        users = db.relationship('User', backref='role', lazy='dynamic')
       
    class User(UserMixin, db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(64), unique=True, index=True)
        username = db.Column(db.String(64), unique=True, index=True)
        password_hash = db.Column(db.String(128))
        role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), nullable=True)
        ticketholiday_id = db.relationship('Ticketholiday', backref='user', lazy='dynamic')
        
    class Ticketholiday(db.Model):
        __tablename__ = 'ticketholidays'
        id = db.Column(db.Integer, primary_key=True)
        type = db.Column(db.Integer)
        about = db.Column(db.Text)
        user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)

    注意你在Role数据库模型中的users,它并不是roles表中的字段,users = db.relationship('User', backref='role', lazy='dynamic'),relationship的第一个参数表示这个关系的另一个数据库模型是哪个,这里是User,第二个参数backref表示给关联的数据库模型添加一个属性,这里是role。
    也就是说,你可以通过User模型的role这个属性去访问Role模型,比如你在views.py中的查询结果,你可以通过user.role.name得到roles表中对应记录的name,user.role.id则得到roles表中对应记录的id
    注意名称的大小写,一一对应

  • 相关阅读:
    [问题2015S13] 复旦高等代数 II(14级)每周一题(第十四教学周)
    [问题2015S12] 复旦高等代数 II(14级)每周一题(第十三教学周)
    [问题2015S11] 复旦高等代数 II(14级)每周一题(第十二教学周)
    [问题2015S10] 复旦高等代数 II(14级)每周一题(第十一教学周)
    [问题2015S09] 复旦高等代数 II(14级)每周一题(第十教学周)
    [问题2015S08] 复旦高等代数 II(14级)每周一题(第九教学周)
    @JsonFormat与@DateTimeFormat注解的使用
    intellij idea 重命名或复制一个项目(不用重启)
    PageHelper中默认PageInfo成员变量
    图片的base64编码
  • 原文地址:https://www.cnblogs.com/dear_diary/p/6804472.html
Copyright © 2011-2022 走看看