SqlAlchemy - 当我迭代查询时,我得到一个列表还是一个迭代器?

时间:2013-03-25 13:17:48

标签: performance memory sqlalchemy

我开始学习如何使用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)而不是列表中获取常量内存迭代器?

0 个答案:

没有答案