使用 sqlalchemy 的复合键自引用关系
Self-referential relations on composite keys using sqlalchemy
我有一个模型,其中包含回复其他消息的消息。相同的 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)
在这种情况下,如何设置关系才能将帐户作为复合键的一部分妥善处理。
最后就像执行以下操作一样简单 -
parent_message = db.relationship("Message",
backref="child_messages",
remote_side=[account, message_id]
)
关键在于使用 remote_side
和复合键。
我有一个模型,其中包含回复其他消息的消息。相同的 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)
在这种情况下,如何设置关系才能将帐户作为复合键的一部分妥善处理。
最后就像执行以下操作一样简单 -
parent_message = db.relationship("Message",
backref="child_messages",
remote_side=[account, message_id]
)
关键在于使用 remote_side
和复合键。