我开始学习如何使用 SQLAlchemy,但遇到了一些效率问题。
我在我们的 Oracle 数据库上创建了一个映射现有大表的对象:
engine = create_engine(connectionString, echo=False)
class POI(object):
def __repr__(self):
return "{poi_id} - {title}, {city} - {uf}".format(**self.__dict__)
def loadSession():
metadata = MetaData(engine)
_poi = Table('tbl_ourpois', metadata, autoload = True)
mapper(POI, _poi)
Session = sessionmaker(bind = engine)
session = Session()
return session
该表有数百万个注册表。当我做一个简单的查询并尝试迭代它时:
session = loadSession()
for poi in session.query(POI):
print poi
我注意到两件事:(1)它需要几分钟才能开始在屏幕上打印对象,(2)内存使用量开始疯狂增长。所以,我的结论是这段代码获取了列表中的所有结果集,然后对其进行迭代。这个对吗?
使用cx_Oracle
,当我执行如下查询时:
conn = cx_Oracle.connect(connectionString)
cursor = conn.cursor()
cursor.execute("select * from tbl_ourpois")
for poi in cursor:
print poi
生成的游标表现为一个迭代器,它将结果放入缓冲区并在需要时返回它们,而不是将整个事物加载到列表中。该循环几乎立即开始打印结果,并且内存使用率非常低且恒定。
我可以通过 SQLAlchemy 获得这种行为吗?有没有办法从session.query(POI)
列表中获取常量内存迭代器?