编辑:主题: 有没有办法可以强制SqlAlchemy尽可能预先填充会话?尽可能从数据库中同步尽可能多的状态(此时不会有数据库更新)。
我遇到了一些轻微的性能问题,我相信我已将其追溯到SqlAlchemy。我确定我的声明式和db-schema有可能改变时间的变化,但这不是我在这里要求的。
我的SqlAlchemy声明式定义了8个类,我的数据库有11个表,其中只有7个表持有我的真实数据,而我的数据库总共有800个记录(所有整数和UnicodeText)。我的数据库引擎是sqlite,实际大小目前是242Kb。
实际上,实体的数量非常少,但许多表关系都具有递归行为(深度为5-6级)。我的问题始于SA为我做的精彩自动化,以及我不愿用我自己的python类正确提取数据。
我将ORM属性访问分散在所有类型的迭代器,递归计算器,直到我的文件I / O流。对这些属性的访问很大程度上是非线性的,而且每次查找时,我的callstack都会在SqlAlchemy中消失很长一段时间,而且我会收到很多单例查询。
我主要使用默认的SA设置(python 2.7.2,sqlalchemy 0.7)。
考虑到RAM不是问题,而且我的数据库是如此之小(暂时),有没有办法我可以强制SqlAlchemy尽可能地预先填充会话。我希望如果我只是将原始数据加载到内存中,那么我将要做的最多就是动态地追逐几个连接(几乎所有查询都非常简单)。
我希望能有5分钟的修复,所以我可以尽快运行一些报告。我下个月的TODO可能会充满直接的表查询和更严格的业务逻辑,可以管理元组。
答案 0 :(得分:1)
这种问题的五分钟修复是不太可能的,但对于多对一的“单身”来说,我经常使用一个简单的配方。假设您正在加载大量User
个对象,并且它们都具有对Category
某种类型的多对一引用:
# load all categories, then hold onto them
categories = Session.query(Category).all()
for user in Session.query(User):
print user, user.category # no SQL will be emitted for the Category
这是因为多对一发出的query.get()
将首先在本地身份映射中查找主键。
如果您正在寻找更多缓存(并且备用时间超过五分钟),可以扩展相同的概念,以便以与缓存仅关联的方式缓存SELECT语句的结果当前会话 - 查看分发示例中包含的local_session_caching.py配方。