【问题标题】:How to implement many to many relationship using flask sqlalchemy?如何使用烧瓶 sqlalchemy 实现多对多关系?
【发布时间】:2020-07-11 23:24:06
【问题描述】:

嗨,我是烧瓶 sqlalchemy 的新手,尤其是在关系模型方面,有人可以帮助我多对多关系模型的概念是什么。我的示例用例是用户可以有多个组,组可以有多个用户。我是否正确的关系将是“多对多”关系模型?还是基于我的示例用例的其他模型? 我已经搜索了很多关于这些的内容,但我并不完全理解这个概念和实现。在此先感谢:-)

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    是的,这在您的场景中被视为多对多关系。例如,考虑一个具有用户和组的数据库。我们可以说一个用户有很多组,一个组有很多用户。这就像从双方重叠的一对多关系。这实际上在关系数据库中表示并不简单,并且不能通过简单地将外键添加到现有表来完成。为了适应这一点,您需要一个额外的表来充当存储两个表的主键的中间/辅助。

    这是一个使用 Flask-Sqlalchemy 的实现:

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:////tmp/test.db"
    db = SQLAlchemy(app)
    
    # act as auxiliary table for user and group table
    user_groups = db.Table(
        "user_groups",
        db.Column("user_id", db.Integer, db.ForeignKey("user.id")),
        db.Column("group_id", db.Integer, db.ForeignKey("group.id")),
    )
    
    
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(120), unique=True, nullable=False)
        groups = db.relationship("Group", secondary=user_groups, back_populates="users")
    
    
    class Group(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(120), nullable=False)
        users = db.relationship("User", secondary=user_groups, back_populates="groups")
    

    更多参考: https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html How to build many-to-many relations using SQLAlchemy: a good example

    【讨论】:

    • 您好,Kelvin,感谢您的帮助。还有一个问题,我说得对,这是双向关系吗?基于文档。但我并不完全理解双向关系的含义。你能解释一下它是什么吗?提前致谢。
    • 是的,您的情况是双向关系。双向意味着,当您访问用户模型时,您还可以通过 db、relationship 访问组模型,而另一方面,当您访问组模型时,您可以访问用户模型。这两种情况都很有用,假设您想查询用户拥有的组列表,或者您想查询组列表以及每个组中有多少用户
    • 如何为它编写查询? User.query().all()
    猜你喜欢
    • 1970-01-01
    • 2020-11-21
    • 2014-11-02
    • 2016-06-18
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多