我有一个用关系定义的表,我注意到,即使我在查询中不使用联接,仍然会检索到信息:
class Employee(Base):
__tablename__ = "t_employee"
id = Column(Identifier(20), Sequence('%s_id_seq' % __tablename__), primary_key=True, nullable=False)
jobs = relationship("EmployeeJob")
roles = relationship("EmployeeRole")
class EmployeeJob(Base):
__tablename__ = "t_employee_job"
id = Column(Integer(20), Sequence('%s_id_seq' % __tablename__), primary_key=True, nullable=False)
employee_id = Column(Integer(20), ForeignKey('t_employee.id', ondelete="CASCADE"), primary_key=True)
job_id = Column(Integer(20), ForeignKey('t_job.id', ondelete="CASCADE"), primary_key=True)
class EmployeeRole(Base):
__tablename__ = "t_employee_role"
id = Column(Integer(20), Sequence('%s_id_seq' % __tablename__), primary_key=True, nullable=False)
employee_id = Column(Integer(20), ForeignKey('t_employee.id', ondelete="CASCADE"), nullable=False)
location_id = Column(Identifier(20), ForeignKey('t_location.id', ondelete="CASCADE"))
role_id = Column(Integer(20), ForeignKey('t_role.id', ondelete="CASCADE"), nullable=False)
session.query(Employee).all()
也检索角色和作业,但通过查询每行的数据库来实现。在
关于这种情况,我有两个问题:
1就表现而言,我想我应该自己去参加。我说的对吗?
2如何将表映射到某个数据结构?例如,我想获取员工及其角色的列表,其中每个角色都应该由位置ID和角色ID的数组表示,例如{id:1, jobs:[1,2,3], roles:[[1,1],[1,2],[2,3]]}
我终于找到了一个方法来完成我的第二个问题,并决定回答我自己的问题,为他人着想:
关系中的级联是为了确保在更新列表后删除孤立项,并且decorator定义每个复杂属性的getter和setter
谢谢你,范给我指出了正确的方向!在
1)请阅读SA文档中的Eager Loading。 默认情况下,关系在第一次访问时延迟加载。在您的例子中,您可以使用,例如,Joined Load,以便在同一个查询中加载相关行:
如果希望在加载} 配置为自动加载:
^{pr2}$Employee
时始终加载这些关系,可以将^{2)只需创建一个从查询中提取数据结构的方法。如下所示(使用答案第一部分中的
qry
):还要注意:您的
EmployeeJob
表有一个有趣的primary_key
,它既包括id
列,也包括两个ForeignKey
列。我认为你应该选择其中一个。相关问题 更多 >
编程相关推荐