Selectinload(A,B) против selectinload(A).selectinload(B)Python

Программы на Python
Anonymous
 Selectinload(A,B) против selectinload(A).selectinload(B)

Сообщение Anonymous »

Я работаю над проектом, использующим SQLAlchemy с параметром lazy='raise', установленным для отношений, чтобы предотвратить неявную отложенную загрузку. Я пытаюсь понять реальную разницу между этими двумя формами быстрой загрузки:
  • selectinload(JobDto.project, ProjectDto.project_defaults); против
  • selectinload(JobDto.project).selectinload(ProjectDto.project_defaults)
Кажется, оба выражают "загрузить JobDto.project, а затем его 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

Вернуться в «Python»