【发布时间】:2020-07-11 23:24:06
【问题描述】:
嗨,我是烧瓶 sqlalchemy 的新手,尤其是在关系模型方面,有人可以帮助我多对多关系模型的概念是什么。我的示例用例是用户可以有多个组,组可以有多个用户。我是否正确的关系将是“多对多”关系模型?还是基于我的示例用例的其他模型? 我已经搜索了很多关于这些的内容,但我并不完全理解这个概念和实现。在此先感谢:-)
【问题讨论】:
标签: python sqlalchemy
嗨,我是烧瓶 sqlalchemy 的新手,尤其是在关系模型方面,有人可以帮助我多对多关系模型的概念是什么。我的示例用例是用户可以有多个组,组可以有多个用户。我是否正确的关系将是“多对多”关系模型?还是基于我的示例用例的其他模型? 我已经搜索了很多关于这些的内容,但我并不完全理解这个概念和实现。在此先感谢:-)
【问题讨论】:
标签: python sqlalchemy
是的,这在您的场景中被视为多对多关系。例如,考虑一个具有用户和组的数据库。我们可以说一个用户有很多组,一个组有很多用户。这就像从双方重叠的一对多关系。这实际上在关系数据库中表示并不简单,并且不能通过简单地将外键添加到现有表来完成。为了适应这一点,您需要一个额外的表来充当存储两个表的主键的中间/辅助。
这是一个使用 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
【讨论】: