- selectinload(JobDto.project, ProjectDto.project_defaults); против
- selectinload(JobDto.project).selectinload(ProjectDto.project_defaults)
Проблема: 'JobDto.project' недоступен из-за lazy='raise'
Как SQLAlchemy интерпретирует эти две формы внутри себя и когда следует использовать каждую из них?
Пример из моих моделей:
class JobDto(Base):
__tablename__ = 'job'
job_id = Column(BigInteger, primary_key=True)
project_id = Column(Integer, ForeignKey('project.project_id'))
project = relationship("ProjectDto", foreign_keys=[project_id], lazy='raise')
class ProjectDto(Base):
__tablename__ = 'project'
project_id = Column(Integer, primary_key=True)
name = Column(String(255))
project_defaults = relationship(
"ProjectDefaultDto",
cascade="save-update, merge, delete, delete-orphan",
lazy='raise'
)
class ProjectDefaultDto(Base):
__tablename__ = 'project_default'
project_default_id = Column(Integer, primary_key=True)
project_id = Column(Integer, ForeignKey('project.project_id'))
Запрос, который я использую:
stmt = (
select(JobDto)
.options(
# works
selectinload(JobDto.project).selectinload(ProjectDto.project_defaults)
# fails with "JobDto.project is not available due to lazy='raise'"
# selectinload(JobDto.project, ProjectDto.project_defaults)
)
)
Подробнее здесь: https://stackoverflow.com/questions/797 ... ectinloadb
Мобильная версия