如何两次引用外键表?

Posted

技术标签:

【中文标题】如何两次引用外键表?【英文标题】:How do I refer to a foreign key table twice? 【发布时间】:2016-08-25 20:08:51 【问题描述】:

我收到以下错误:

u'detail': u"一个或多个映射器未能初始化 - 无法继续 其他映射器的初始化。最初的例外是:可以 无法确定父/子表之间的连接条件 关系 Vote.user - 有多个外键路径链接 桌子。指定“foreign_keys”参数,提供一个列表 那些应该算作包含外键的列 引用父表。”

A 被定义为:

class User(postgres.Model):

    def __init__(self,
        name
    ):
        self.name = name

    id = postgres.Column(postgres.Integer , primary_key=True , autoincrement=True)
    name = postgres.Column(postgres.String(32) , nullable=False , unique=True)

B 被定义为:

class Vote(postgres.Model):

    def __init__(self,
        user_id,
        responder_id,
        #timestamp_request,
        #timestamp_respond,
        value 
    ):
        self.user_id = user_id
        self.responder_id = responder_id
        #self.timestamp_request = timestamp_request
        #self.timestamp_respond = timestamp_respond
        self.value = value

    id = postgres.Column(postgres.Integer , primary_key=True , autoincrement=True)
    user_id = postgres.Column(postgres.Integer , postgres.ForeignKey('user.id'))
    user = postgres.relationship(User , backref=postgres.backref('votes_user'))
    responder_id = postgres.Column(postgres.Integer , postgres.ForeignKey('user.id'))
    responder = postgres.relationship(User , backref=postgres.backref('votes_responder'))
    timestamp_request = postgres.Column(postgres.DateTime , default=datetime.datetime.utcnow , nullable=False , unique=False)
    timestamp_respond = postgres.Column(postgres.DateTime , default=datetime.datetime.utcnow , onupdate=datetime.datetime.utcnow , nullable=False , unique=False)
    value = postgres.Column(postgres.Enum('up' , 'down' , name='vote_value_enum') , nullable=True)

【问题讨论】:

【参考方案1】:

SQLAlchemy 无法发现关系路径。

user_id = Column(ForeignKey('user.id'))
user = relationship(User, backref=backref('votes_user'))
responder_id = Column(ForeignKey('user.id'))
responder = relationship(User, backref=backref('votes_responder'))

responder 关系是否必须使用responder_iduser_id 加入?我知道这对我们来说很明显,但是 SQLAlchemy 在这里不考虑列名。您可以将responder_id 重命名为foobar,不会有任何区别。

定义要用于每个关系的外键。

user = relationship(User, foreign_keys=[user_id], backref=backref('votes_user'))
responder = relationship(User, foreign_keys=[responder_id], backref=backref('votes_responder'))

【讨论】:

以上是关于如何两次引用外键表?的主要内容,如果未能解决你的问题,请参考以下文章

SQL怎么在有外键的主键表中插数据

可以使用实体框架在另一个表中调用两次作为外键的主键吗?

如何引用一个 CTE 两次?

JOOQ 获取外键表

Sql server怎样创建主外键关系

Sql server怎样创建主外键关系