我如何引用外键表两次? [英] How do I refer to a foreign key table twice?

查看:562
本文介绍了我如何引用外键表两次?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


u'detail':u一个或多个映射器初始化失败 - 无法继续
与其他映射器的初始化。原始异常是:可能
不能确定
关系上的父/子表之间的连接条件Vote.user - 有多个外键路径链接
tables。指定'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)

Tab le 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 = p ostgres.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)


解决方案

SQLAlchemy无法找到关系路径。 b

  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'))
$ b $ p responder 关系必须使用 responder_id USER_ID ?我知道这很明显,但SQLAlchemy在这里不考虑列名。您可以将 responder_id 重命名为 foobar ,这样做没有任何区别。




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

I get the following error:

u'detail': u"One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Could not determine join condition between parent/child tables on relationship Vote.user - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table."

Table A is being defined as:

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)

Table B is being defined as:

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)

解决方案

SQLAlchemy is unable to discover the relationship path.

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'))

Do the responder relationship must join using responder_id or user_id? I know it is obvious to us, but SQLAlchemy don't consider column names here. You can rename responder_id as foobar and it'll make no difference.

Define the foreign keys you want to use for each relationship.

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

这篇关于我如何引用外键表两次?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆