【问题标题】:How to create relationship many to many in SQLAlchemy (python, flask) for model User to itself如何在SQLAlchemy(python,flask)中为模型用户与自身创建多对多关系
【发布时间】:2014-01-18 03:13:58
【问题描述】:

我需要创建一个名为friends的表,它应该如下所示:

朋友:

  • user_id
  • friend_id

我试图通过 SQLALchemy 的教程来做到这一点,但我还没有找到如何为同一个表建立多对多关系。

这是我尝试过的:

# friends table
# many to many - user - user
_friends = db.Table('friends',
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('friend_id', db.Integer, db.ForeignKey('users.id'))
)


class User(db.Model, UserMixin):

    # table name in database
    __tablename__ = 'users'

    # primary key for table in db
    id = db.Column(db.Integer, primary_key=True)

    # email is unique!
    email = db.Column(db.String(255), unique=True)

    # password, max = 255
    password = db.Column(db.String(255))

    # category relation
    categories = relationship("Category")

    # cards relation
    cards = relationship("BusinessCard")

    # friends
    friends = db.relationship(
        'User',
        backref="users",
        secondary=_friends
    )

上面写着:

AmbiguousForeignKeysError:无法确定之间的连接条件 关系 User.friends 上的父/子表 - 有多个 通过辅助表“朋友”链接表的外键路径。 指定“foreign_keys”参数,提供这些列的列表 应该算作包含来自 每个父表和子表的辅助表。

有谁知道如何正确地做到这一点?

【问题讨论】:

    标签: python mysql flask many-to-many flask-sqlalchemy


    【解决方案1】:

    您尝试实现的模式是多对多关系的一种特殊情况。 SQLAlchemy 将此称为邻接列表关系,我建议您尝试按照那里的代码进行操作:

    http://docs.sqlalchemy.org/en/rel_0_9/orm/relationships.html#adjacency-list-relationships

    关键是那里的 'remote_side' kwarg。

    原因如下:您得到的错误是因为您的关联表('friends')有两个指向表'users'的外键:一个在'user_id'列上,一个在'friend_id'列上。 SQLAlchemy 尝试根据外键自动检测关系,但它失败了,因为它无法判断关系的方向。因此,如果您在“朋友”表中有这样的条目

    user_id   : 1
    friend_id : 2
    

    SQLAlchemy 无法判断 user_1 是否有 user_2 作为朋友,反之亦然。

    如果这看起来令人困惑,那就是。社交网络意义上的友谊可以是单射的,在这种情况下,user_1 有朋友 user_2 并不意味着 user_2 有 user_1 作为朋友;或者它可以是双射,在这种情况下两者是等价的。我在这里显示我的年龄,但前者以 Livejournal 为代表,而后者以 Facebook 为代表。

    我不知道如何在 SQLAlchemy 中实现单射关系。在 MySQL 中这是一个丑陋的 UNION ALL 或类似的东西。

    【讨论】:

      【解决方案2】:

      Miguel Grinberg 的教程解释了这种类型的应用程序。

      http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-viii-followers-contacts-and-friends

      【讨论】:

        【解决方案3】:

        您不能直接在 2 个表之间建立多对多关系,而必须使用第 3 个表。

        【讨论】:

          猜你喜欢
          • 2019-01-12
          • 1970-01-01
          • 1970-01-01
          • 2016-08-23
          • 2021-12-09
          • 1970-01-01
          • 2014-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多