2017-09-08 47 views
0

我有一個消息回覆其他消息的模型。相同的message_id可以在多個帳戶中。我無法找到一種方法將帳戶和message_id作爲複合關鍵字並在關係中使用它。使用sqlalchemy組合鍵的自引用關係

我有這個迄今爲止得到:

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) 

如何建立關係以妥善保管帳戶在這種情況下組合鍵的一部分。

回答

0

最後,是因爲這樣做以下簡單 -

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

的關鍵是在使用remote_side複合鍵。