SQLAlchemy多个foreight键

时间:2015-06-19 16:29:32

标签: python sqlalchemy

有人可以解释这样做的正确方法:

class Bracket(Base):
    __tablename__     = 'weekly_bracket'
    bracket_1A_winner = Column( Integer, nullable = False )
    bracket_1B_winner = Column( Integer, nullable = False )
    bracket_2_winner  = Column( Integer, nullable = False )
    handle            = Column( String(250),ForeignKey('user.site_handle') )
    user_id           = Column( Integer, ForeignKey('user.id'), primary_key = True )
    user              = relationship( User )

1 个答案:

答案 0 :(得分:1)

关于多个外键,您可以在文档中查看Multiple Join Paths以获取更多信息。这将更详细地解释发生了什么。

对于您的直接关注,课程有一些问题。您将主键设置为外键。这可能不是你想要的。 class Bracket(Base): __tablename__ = 'weekly_bracket' id = Column ( Integer, primary_key = True ) bracket_1A_winner = Column( Integer, nullable = False ) bracket_1B_winner = Column( Integer, nullable = False ) bracket_2_winner = Column( Integer, nullable = False ) handle = Column( String(250),ForeignKey('user.site_handle') ) user_id = Column( Integer, ForeignKey('user.id') ) user = relationship( 'User', foreign_keys=[user_id] ) 中的表名应该是User类的名称,作为字符串。您还可以在relationship()调用中指定外键。试试这个:

class Bracket(Base):
    __tablename__     = 'weekly_bracket'

    id = Column ( Integer, primary_key = True )
    bracket_1A_winner = Column( Integer, nullable = False )
    bracket_1B_winner = Column( Integer, nullable = False )
    bracket_2_winner  = Column( Integer, nullable = False )
    handle            = Column( String(250),ForeignKey('user.site_handle') )
    bracket1_user_id  = Column( Integer, ForeignKey('user.id') )
    bracket2_user_id  = Column( Integer, ForeignKey('user.id') )

    bracket1_user     = relationship( 'User', foreign_keys=[bracket1_user_id] )
    bracket2_user     = relationship( 'User', foreign_keys=[bracket2_user_id] )

在您的情况下,我在这里看不到您需要多个外键的位置。如果您有两个用户,有两个关系,这将导致多个外键。例如:

var c = $("myCanvas");

正如@ChristopherPearson所提到的,你不需要'id'字段充当primary_key(我删除了不正确的评论)。使用user_id作为主键是可以的,因为user_id字段也是唯一的。但是,如果您希望用户拥有多个括号,则该关系将无法长时间运行。