【问题标题】:Is SQLAlchemy ORM the right choice for larga data?SQLAlchemy ORM 是大型数据的正确选择吗?
【发布时间】:2013-10-22 05:49:57
【问题描述】:

我正在开发一个 Web 应用程序,有时我需要从我的数据库中选择 1.000.000 行。

我的脚本如下所示:

engine = create_engine(
             "mysql://:@localhost/test",
             isolation_level="READ UNCOMMITTED",echo=False
        )

meta = MetaData(bind=engine)
meta.reflect(bind=engine)


cr =  meta.tables['cr']
bl = meta.tables['bl']

DBSession = scoped_session(
    sessionmaker(
        autoflush=True,
       autocommit=False,
         bind=engine
    )
)

test_query = session.query(bl,cr).filter(bl.c.severity_logged == '4_minor')
print test_query.all()

它不断扫描磁盘并增加内存使用量,但没有显示任何内容。

在 MySQL 命令中,4 秒后返回结果。 如何使用 SQLALchemy 检索大量数据?

【问题讨论】:

  • 标题的第一个字符请使用大写字符
  • 首先,您确定您从 SQLAlchemy 生成的查询与您放入 MySQL 的查询相同吗?其次,你真的需要一次获得 100 万行吗?
  • 是的,我确信这两个查询是相同的。那么我需要做的是,获取 1 000 000 个查询行结果,将它们存储在字典列表(Python)中,然后计算结果的一些指标。也许我不需要将查询结果存储到内存中以便以后对它们进行计算?你有什么建议,我是 Python 的新手,所以你的帮助会很棒。
  • 我对 SQLAlchemy 不是很熟悉,但也许值得检查一下您是否可以让 SQL 通过聚合函数为您计算“指标”,而不是自己计算。那么你就不需要检索一百万行......这显然取决于你想要计算的复杂性......

标签: python sql performance sqlalchemy


【解决方案1】:

您使用 SQLAlchemy 的方式是要求它为 blcr 创建 1,000,000 多个数据访问对象实例。无论您使用哪种语言或构造,这都会很慢。您会做得更好:

  • 将数据过滤到合理的数量以显示在屏幕上(例如test_query.limit(100).all()
  • 完全跳过 DAO 步骤,只将数据流式传输到其端点(在本例中为标准输出)。

【讨论】:

  • 什么是DAO?我不明白你的第二个解决方案
  • @user1734229- D 数据 A 访问 O 对象。在第二种情况下,您只需在 enginecursor = conn.execute("SQL HERE")print cursor.fetchall() 之间创建一个连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2022-01-22
相关资源
最近更新 更多