【问题标题】:SQLAlchemy: relationship collection lazy loadingSQLAlchemy:关系集合延迟加载
【发布时间】:2019-10-02 01:23:33
【问题描述】:

根据 SQLAlchemy documentation on relationship loading:

当给定的集合或引用首次访问特定对象时,会发出一个附加的 SELECT 语句,以便加载请求的集合。

如何实现加载行为,以便只加载我访问的关系集合的单个元素,而不是一次加载整个集合?

我听说过deferred column loading;这更像是“延迟行加载”。我不想延迟加载属性,而是延迟加载关系集合元素。

所需用例:

# 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()

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    lazy 参数与dynamic 值一起使用:

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

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

    【讨论】:

    • 虽然用例并不完全符合我的想象,但这正是我所寻找的。我们现在有'data' in coln.__dict__ == False,而不是len(coln.__dict__['data']) == 1。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2011-09-07
    • 2020-01-23
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多