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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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