継承と関係を持つ 3 つのモデルがあり、このモデルにクエリをキャッシュしたいと考えています。
class Person(Base):
__tablename__ = 'person'
id = Column(Integer, primary_key=True)
name = Column(String(100), nullable=False)
type = Column(String(50))
__mapper_args__ = {
'polymorphic_identity': 'object',
'polymorphic_on': type
}
class Man(Person):
__tablename__ = 'man'
id = Column(Integer, ForeignKey('person.id'), primary_key=True)
age = Column(String(100), nullable=False)
__mapper_args__ = {'polymorphic_identity': 'man'}
class Config(Base):
__tablename__ = "config"
id = Column(Integer, primary_key=True)
person = Column(Integer, ForeignKey('person.id'))
address = Column(String)
person_ref = relationship(Person)
パーソナルから受け継いだモデルは他にもたくさんあります。たとえば、構成関係を介してMan属性にアクセスする必要があります。通常、私は次のようにします:
config = session.query(Config).join(Config.person_ref).filter(Person.type == 'man').first()
print config.person_ref.age
このようなクエリをdogpileでキャッシュするにはどうすればよいですか? クエリをConfigにキャッシュすることはできますが、クエリをManの属性にキャッシュすることはできず、毎回 SQL を発行します。with_polymorphic を使用しようとしましたが、joinedload なしでしか機能しません。(理由はわかりません)
config = session.query(Config).options(FromCache("default")).first()
people = session.query(Person).options(FromCache("default")).with_polymorphic('*').get(config.person)
しかし、タイプをフィルタリングするにはjoinedloadが必要です。