在SQLAlchemy中使用联接

时间:2016-12-15 22:59:03

标签: python mysql sqlalchemy

我有两张桌子:

class Candidate(Base):
    __tablename__ = 'candidates'
    id = Column(Integer, primary_key=True)
    email = Column(String)
    first = Column(String)
    last = Column(String)
    company = Column(String)
    title = Column(String)
    linkedin_url = Column(String, unique=True)
    role = Column(String)

    emails = relationship("Email", back_populates="candidate")

class Email(Base):
    __tablename__ = 'emails'
    id = Column(Integer, primary_key=True)
    candidate_id = Column(Integer, ForeignKey('candidates.id'))
    email_id = Column(String, nullable=False)
    thread_id = Column(String, nullable=False)
    date = Column(String, nullable=False)
    subject = Column(String, nullable=False)
    to = Column(String, nullable=False)
    carbon_copy = Column(String, nullable=False)
    from_ =  Column(String, nullable=False)
    text_body = Column(String, nullable=False)
    epoch_time = Column(String, nullable=False)

    candidate = relationship("Candidate", back_populates="emails")

我试图在SQLAlchemy中编写连接:

q = db_session.query(Candidate).join(Email)

我希望能够执行q.first().email_idq.first().id之类的操作,但我收到错误AttributeError: 'Candidate' object has no attribute 'email_id'

当我打印出原始SQL:print str(q)时,它会返回FROM candidates JOIN emails ON candidates.id = emails.candidate_id

看起来是正确的。

那么,当我尝试访问连接表时,为什么会出现错误? q.first().id会返回1,但q.first().email_id会出错。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我想我理解你的问题。由于候选人和电子邮件之间存在一对多关系(意味着一个候选人可以收到许多电子邮件),因此当您访问候选人的emails媒体资源时,实际上是在访问一个列表。

所以而不是

q.first().email_id

你需要使用

for each in q.first().emails:
    print each.email_id

答案 1 :(得分:0)

q = db_session.query(Candidate, Email).join(Email)

那个表达符合我的要求。