SQLAlchemy-查询多个表并返回嵌套对象

时间:2019-03-25 19:15:40

标签: python orm sqlalchemy foreign-keys

假设我们与公司之间存在简单的一对多关系,是否可以查询所有公司并在每个公司的属性中具有员工列表?

class Company(Base):
    __tablename__ = 'company'

    id = Column(Integer, primary_key=True)
    name = Column(String)


class Employee(Base):
    __tablename__ = 'employee'

    id = Column(Integer, primary_key=True)
    first_name = Column(String)
    last_name = Column(String)
    company_id = Column(Integer, ForeignKey(Company.id))

我正在寻找这样的东西:

>>> result = db.session.query(Company).join(Employee).all()
>>> result[0].Employee
[<Employee object at 0x...>, <Employee object at 0x...>]

结果的大小应与公司表中的行数相同。

我尝试了以下操作,它给出了对象的元组(有意义),而不是漂亮的父/子结构:

>>> db.session.query(Company, Employee).filter(Company.id = Employee.company_id).all()

将它转换成我想要的对象结构并不难,而只是想看看是否有任何快捷方式。

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

class Company(Base):
    __tablename__ = 'company'

    id = Column(Integer, primary_key=True)
    name = Column(String)

    employees = db.session.query(Company, Employee).filter(Company.id = self.id).all()
    self.employee_list = ['{0} {1}'.format(c.first_name, c.last_name) for c in employees]

然后,您可以使用Company.employee_list[0]

访问员工姓名

答案 1 :(得分:0)

您必须在父类中配置关系:

class Company(Base):
    __tablename__ = 'company'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    employees = relationship('Employee', lazy='joined') # <<< Add this line

然后,您可以在没有联接的情况下查询它:

companies = session.query(Company).all()
print(companies[0].employees)

文档: https://docs.sqlalchemy.org/en/13/orm/loading_relationships.html