问题描述
|
就我而言,对基础数据库的查询非常昂贵,因此我们试图尽可能地保存数据库请求。
这是简化的数据库,我将使用它作为示例:
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 (将#修改为@)