加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLAlchemy通过关联对象声明多对多自连接

发布时间:2020-12-12 07:49:26 所属栏目:MsSql教程 来源:网络整理
导读:我有一个表用户和一个表朋友,将用户映射到其他用户,因为每个用户可以有很多朋友.这个关系显然是对称的:如果用户A是用户B的朋友,那么用户B也是用户A的朋友,我只存储这个关系一次. Friends表除了两个User ID之外还有其他字段,所以我必须使用一个关联对象. 我试
我有一个表用户和一个表朋友,将用户映射到其他用户,因为每个用户可以有很多朋友.这个关系显然是对称的:如果用户A是用户B的朋友,那么用户B也是用户A的朋友,我只存储这个关系一次. Friends表除了两个User ID之外还有其他字段,所以我必须使用一个关联对象.

我试图在用户类(扩展声明基础)中的声明式样中定义这种关系,但我似乎无法弄清楚如何做到这一点.我希望能够通过财产的朋友访问给定用户的所有朋友,所以说朋友= bob.friends.

这个问题最好的办法是什么?我尝试了许多不同的设置发布在这里,没有一个工作原因各异.

编辑:我的最新尝试如下:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer,primary_key=True)

    # Relationships
    friends1 = relationship('Friends',primaryjoin=lambda: id==Friends.friend1ID)
    friends2 = relationship('Friends',primaryjoin=lambda: id==Friends.friend2ID)


class Friends(Base):
    __tablename__ = 'friends'
    id = Column(Integer,primary_key=True)
    friend1ID = Column(Integer,ForeignKey('users.id') )
    friend2ID = Column(Integer,ForeignKey('users.id') )
    status = Column(Integer)

    # Relationships
    vriend1 = relationship('Student',primaryjoin=student2ID==Student.id)
    vriend2 = relationship('Student',primaryjoin=student1ID==Student.id)

但是,这会导致以下错误:InvalidRequestError:已为此MetaData实例定义了表’users’.指定’extend_existing = True’以重新定义现有Table对象上的选项和列.
我必须承认,在这一点上,由于许多失败的尝试,我彻底困惑,可能在上述方面犯了不止一个愚蠢的错误.

解决方法

通过重复定义类映射(例如,在交互式解释器中,或在可以被多次调用的函数中)或通过将声明式类映射与表混合来描述该表而引起的特殊异常反射.在前一种情况下,消除重复呼叫;开始一个新的口译员,如果你是交互式地做,或消除额外的函数调用(可能是一个很好的用于单身/ borg对象).

在后一种情况下,只需执行异常说明,在类定义中添加__table_args__ = {‘extend_existing’:True}作为额外的类变量.只有这样,如果你确实确实正确描述了两次表,就像桌面反射一样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读