【问题标题】:SQLAlchemy - querying multiple tables and returning nested objectsSQLAlchemy - 查询多个表并返回嵌套对象
【发布时间】:2019-08-16 02:49:10
【问题描述】:

假设我们在 Company 和 Employee 之间有一个简单的一对多关系,有没有办法查询所有公司并在每个公司的属性中都有一个员工列表?

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()

把它转换成我想要的对象结构并不难,只是想看看有没有捷径。

【问题讨论】:

    标签: python orm sqlalchemy foreign-keys


    【解决方案1】:

    必须在父类中配置关系:

    class Company(Base):
        __tablename__ = 'company'
    
        id = Column(Integer, primary_key=True)
        name = Column(String)
        employees = relationship('Employee', lazy='joined') # <<< Add this line
    

    那么就可以不用join来查询了:

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

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

    【讨论】:

      【解决方案2】:

      你可以这样做:

      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] 访问员工姓名

      【讨论】:

      • 这是一个糟糕的主意,因为它会延迟加载值而不是问题中描述的所需方法(使用连接)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 2018-08-22
      • 1970-01-01
      相关资源
      最近更新 更多