使用sqlalchemy

时间:2017-09-08 08:45:26

标签: python sqlalchemy flask-sqlalchemy composite-key

我有一个模型,其中包含回复其他消息的消息。相同的message_id可以在多个帐户中。我无法找到一种方法来使帐户和message_id成为一个复合键并在关系中使用它。

我已经走到了这一步:

class Message(Base):
    __tablename__ = 'messages'
    id = Column(String(20), primary_key=True)
    account = Column(String(20))
    message_id = Column(String(20))
    in_reply_to_message_id = Column(String(20))
    __table_args__ = (ForeignKeyConstraint([account, in_reply_to_message_id],
                                           ['messages.account', 'messages.message_id']),
                      {})

    parent_message = db.relationship('Message', remote_side=[message_id],
            primaryjoin=('Message.account==Message.account and Message.in_reply_to_message_id==Message.message_id'),
            backref=backref('child_messages'), uselist=False)

当我尝试message.parent_message时,生成的查询缺少where子句中的帐户比较 -

WHERE %(param_1)s = messages.message_id

我也收到警告:

SAWarning: Multiple rows returned with uselist=False for lazily-loaded attribute 'Tweet.parent_tweet' 
  % self.parent_property)

在这种情况下,如何设置关系以正确处理帐户作为复合键的一部分。

1 个答案:

答案 0 :(得分:0)

最后,它就像执行以下操作一样简单 -

parent_message = db.relationship("Message",
                    backref="child_messages",
                    remote_side=[account, message_id]
              )

关键在于使用remote_side复合键。