微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

确定SQLAlchemy对象的实际加载/卸载状态及其关系

如何解决确定SQLAlchemy对象的实际加载/卸载状态及其关系

| 就我而言,对基础数据库查询非常昂贵,因此我们试图尽可能地保存数据库请求。 这是简化的数据库,我将使用它作为示例:
items_table = Table(\"invtypes\",gdata_Meta,Column(\"typeID\",Integer,primary_key = True),Column(\"typeName\",String,index=True),Column(\"groupID\",ForeignKey(\"invgroups.groupID\"),index=True))

mapper(Item,items_table,properties = {\"group\" : relation(Group,backref = \"items\"),\"ID\" : synonym(\"typeID\"),\"name\" : synonym(\"typeName\")})

groups_table = Table(\"invgroups\",dbMetadata,Column(\"groupName\",String))

mapper(Group,groups_table,properties = {\"ID\" : synonym(\"groupID\"),\"name\" : synonym(\"groupName\")})
然后我们获取一些Item对象和组之一:
engine = create_engine(\"sqlite:///<path-to-db>\",echo=True)
Session = sessionmaker(bind=engine)
session = Session()

itm = session.query(Item).get(11184)   #1
grp = session.query(Group).get(831)    #2
在这种情况下,itm.groupID = 831,因此itm \的组已经加载到内存中。然而:
>>>attributes.instance_state(itm).unloaded
set([\'group\',\'name\',\'ID\'])
sqlAlchemy指示已卸载\'group \'属性/ \'itm \'的关系。但是,在这种情况下,访问它时,不会向基础数据库发出任何查询,因为它已经在标记为#2的行中加载。第一次访问后,它不再标记为已卸载。 现在,让我们以上面的示例结束并大体谈一下。当访问Item对象的group属性时,具有请求ID的组可以已经在某处引用(即,已在当前会话中映射)或仅存在于基础数据库中。 我当前的目标是找到一种方法来可靠地确定具有给定ID及其\'group \'属性/关系的Item是否已经加载到内存中或执行itm加载,然后访问itm.group,并且如果sqlAlchemy无法从中提取内容它的对象映射,即将向基础数据库发出查询-拦截它并发出另一个数据库请求。这应该保证最多需要一个数据库请求(在需要时就进行紧急加载)来加载我需要的所有内容,或者如果所有内容都已加载,则为零个请求。 正如我在以上段落之一中所述,attributes.instance_state()。unloaded不是一种可靠的方法。它不会检测从未访问过的属性/关系的实际加载状态。 我计划使用它来优化涉及急切加载的查询(即,在所有请求的对象都已加载的情况下,这种情况在我的情况下经常发生,并且这些查询的差异足够大,以致查询缓存无法为它们工作) )。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。