SQLAlchemy: коллекция отношений ленивая загрузка - PullRequest
0 голосов
/ 15 мая 2019

Согласно документации SQLAlchemy о загрузке отношений :

При первом обращении к данной коллекции или ссылке на конкретный объект генерируется дополнительный оператор SELECT, так что загружается запрошенная коллекция.

Как мне добиться такого поведения при загрузке, чтобы загружались только отдельные элементы коллекции отношений, к которым я обращаюсь, а не вся коллекция одновременно?

Я слышал о отложенной загрузке столбца ; это было бы больше похоже на «отложенную загрузку строки». Вместо того, чтобы откладывать загрузку атрибутов, я бы хотел отложить загрузку элементов коллекции отношений.

Желаемый вариант использования:

# Persist instance.
coln = Collection([1, 2, 3])
session.add(coln)
session.commit()

# Test lazy loading.
print('data' in coln.__dict__)
# Lazy loads the entire collection. I'd like only one element.
print(coln.data[1])
# Will output: "True 3". I'd like: "True 1".
print('data' in coln.__dict__, len(coln.__dict__['data']))

Определения классов и другое вспомогательное оборудование:

from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()
engine = create_engine('sqlite:///:memory:')

# Define classes.
class Collection(Base):
    __tablename__ = 'collection'
    id = Column(Integer, primary_key=True)
    data = relationship('Element')

    def __init__(self, list_):
        self.data = [Element(e) for e in list_]

class Element(Base):
    __tablename__ = 'element'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('collection.id'))
    value = Column(Integer)

    def __init__(self, value):
        self.value = value

    def __repr__(self):
        return 'Element({})'.format(self.value)

# Create schema.
Base.metadata.create_all(engine)

# Create session.
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()

1 Ответ

1 голос
/ 15 мая 2019

Используйте параметр lazy со значением dynamic:

data = relationship('Element', lazy='dynamic')

https://docs.sqlalchemy.org/en/13/orm/collections.html#dynamic-relationship

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...