我有两张桌子:
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_id
和q.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
会出错。
有什么想法吗?
答案 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)
那个表达符合我的要求。