Sqlalchemy 类不是可迭代的/将关系转换为集合



我正在尝试将多对多关系的一对多部分转换为python set()。有关代码,请参阅以下播放示例:

message_tos = Table('message_tos', Base.metadata,                                
    Column('message_id', Integer, ForeignKey('message.id')), 
    Column('address_id', Integer, ForeignKey('address.id'))
)
class Address(Base):
    address = Column(String, nullable=False, unique=True)
    emails = relationship('Message')
    def __init__(self, address):
        self.address = address
class Email(Base):
    from = relationship('Address', backref='from')
    to = relationship('Address', secondary=message_tos, backref='messages_to')
    message_id = Column(String, nullable=False, unique=True)
...
def whatever(*args, **kwargs):
    """
        ...
    """
    email = session.query(Email).filter(Email.message_id==message_id).first()
    blah = set(email.to).union(email.from) # This lines throws an error that Address is not iterable

有没有办法运行set(email.to)代码(将 Address 对象放入一个集合中),还是我完全错误地这样做?显然,我可以只做set([email.to]),但是这是一个完整的额外复杂性顺序(并且这个函数可能会被多次调用,可能很长的.to或.from列表),我宁愿没有

您的错误很可能不是发生在set(email.to)部分,而是发生在.union(email.from) 中,因为email.from不是可迭代的。根据您的代码,email.fromAddress的实例。

不过这应该有效:blah = set(email.to).union([email.from]).我假设这并没有真正调用属性from,因为它是python中的保留关键字。我想sender是个好名字。


另请注意,在 SA 中,使用Query.get可以更清楚地搜索主键:

email = session.query(Email).get(message_id)

最新更新