多对多关系烧瓶sqlalchemy和棉花糖

时间:2020-08-01 09:07:01

标签: python-3.x flask sqlalchemy flask-sqlalchemy flask-marshmallow

假设我有2个表,表1由用户信息组成,表2由分支信息组成。 表1和表2之间存在多对多关系。 例如1个用户可以在多个分支机构工作,而1个分支可以有多个用户。 所以这里没有亲子概念。我想知道是否必须使用架构创建另一个表并将其与使用外键的用户表和分支表相关联,还是应该创建一个关联表。

我已经做到了:

class UserBranchMap(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    branch_id = db.Column(db.Integer,db.ForeignKey('branch.id'))
    branch = db.relationship("Branch", backref=db.backref("UBMbranch", lazy="dynamic"))
    user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
    user = db.relationship("User", backref=db.backref("UBMuser", lazy="dynamic"))
    created_at = db.Column(db.VARCHAR(20), nullable = False)
    created_by = db.Column(db.VARCHAR(20), nullable = False)

class UserBranchMapSchema(ma.Schema):
    branch = fields.Nested(branch_schema)
    user = fields.Nested(user_schema)
    class Meta:
        fields = ('branch_id','user_id','created_at','created_by')

userbranchmap_schema = UserBranchMapSchema()
userbranchmaps_schema = UserBranchMapSchema(many = True)

关联表和此映射表有什么区别?

1 个答案:

答案 0 :(得分:3)

如果我对您的理解正确,那么您是在询问关联表之间的区别

UserBranches = db.Table(
    'user_branches',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('branch_id', db.Integer, db.ForeignKey('branch.id'), primary_key=True)
)

和映射表

class UserBranch(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user = db.relationship("User", backref=db.backref("UBMuser", lazy="dynamic"))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    branch = db.relationship("Branch", backref=db.backref("UBMbranch", lazy="dynamic"))
    branch_id = db.Column(db.Integer, db.ForeignKey('branch.id'))

在数据库级别上,它们之间没有真正的区别。如果只想在两个表之间建立严格的“多对多”关系,则只需使用关联表即可。由于使用了SQLAlchemy,因此您无需做任何事情,因为只要将Users加入到Branches或相反,就可以自动通过该表进行加入。

但是,如果您想要做更多的事情,例如让它实际上表示一种关系,那么就像您编写映射表一样,映射表也将按照其方式行事,因为它的行为与普通表完全相同。这意味着您可以像UserBranch.created_at一样使用它,甚至可以直接查询它。