2013-10-14 33 views
1

我正在開發一個Web應用程序,在某些時候,我需要從我的數據庫中選擇1.000.000行。SQLAlchemy ORM是否是larga數據的正確選擇?

我的劇本是這樣的:

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檢索大量數據?

+0

請使用大寫字母作爲標題的第一個字符 –

+0

首先,您確定從SQLAlchemy生成的查詢和您在MySQL中的查詢是相同的嗎?其次,你真的需要一次獲得1M行嗎? –

+0

是的,我確定這兩個查詢都是一樣的。 \t 那麼我需要做的是,獲得1 000 000個查詢行結果,將它們存儲在一個字典列表(Python)中,然後計算結果的一些度量標準。也許我不需要將查詢結果存儲到內存中,以便稍後對它們進行計算?你有什麼建議,我是一個Python新手,所以你的幫助會很好。 – salamey

回答

1

您使用SQLAlchemy的方式要求它爲blcr創建1,000,000+個數據訪問對象的實例。這將是緩慢的,不管是什麼語言或構建你這樣做你會好不:

  • 過濾數據下降到一個合理的量,顯示在屏幕上(例如test_query.limit(100).all()
  • 完全跳過DAO步驟,只是將數據流式傳輸到其端點(在本例中爲標準輸出)。
+0

什麼是DAO?我不明白你的第二個解決方案 – salamey

+1

@ user1734229- ** D ** ata ** A ** ccess ** O ** bject。在第二種情況下,您只需創建一個與'engine'關聯的連接,然後創建'cursor = conn.execute(「SQL HERE」)',然後'print cursor.fetchall()'。 –