Python sqlalchemy中相关表的查询

Python sqlalchemy中相关表的查询,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,所以我有两张表和这样的细节 class Employee(Base): __tablename__ = 'employees' id = Column(Integer, Sequence('employee_id_seq'), primary_key=True) name = Column(String(50), nullable=False) ............ class Detail(Base): __tablename__ = 'detai

所以我有两张表和这样的细节

class Employee(Base):
    __tablename__ = 'employees'
    id = Column(Integer, Sequence('employee_id_seq'), primary_key=True)
    name = Column(String(50), nullable=False)
    ............

class Detail(Base):
    __tablename__ = 'details'
    id = Column(Integer, Sequence('detail_id_seq'), primary_key=True)
    start_date = Column(String(50), nullable=False)
    email = Column(String(50))
    employee_id = Column(Integer, ForeignKey('employee.id'))
    employee = relationship("Employee", backref=backref('details', order_by=id))
    ............
现在我想做的是获取所有员工及其相应的详细信息,以下是我尝试的

for e, d in session.query(Employee, Detail).filter(Employee.id = Detail.employee_id).all():
    print e.name, d.email
问题是它会将所有内容打印两次。我尝试使用.join()并打印了两次结果

我想要达到的是

print Employee.name
print Employee.details.email

如果您只关心少数列,则可以直接在查询中指定它们:

q = session.query(Employee.name, Detail.email).filter(Employee.id == Detail.employee_id).all()
for e, d in q:
    print e, d
如果您确实想加载对象实例,那么我将采用不同的方式:

# query all employees
q = (session.query(Employee)
        # load Details in the same query
        .outerjoin(Employee.details)
        # let SA know that the relationship "Employee.details" is already loaded in this query so that when we access it, SA will not do another query in the database
        .options(contains_eager(Employee.details))
        ).all()

# navigate the results simply as defined in the relationship configuration
for e in q:
    print(e)
    for d in e.details:
        print(" ->", d)

至于你的
重复
结果的问题,我相信你的真实代码中有一些“额外的”导致了这个错误…

可能有两个查询结果,因此它将被打印两次。查询结果是什么?它会像John Doe这样打印结果,john@gmail.com无名氏,john@gmail.com葛根,groot@gmail.com葛根,groot@gmail.comPlease添加通过运行此查询生成的
SQL
查询,因为它实际上不应该生成任何重复项。或者,如果您的真实代码有一些其他连接或where子句,为了完整性,请将它们也显示出来。谢谢,您的第二个建议应该有效。我不知道.outerjoin()和.options()