2015-09-18 15 views
1

我已經繼承了一個SQLQlchemy/SQLSoup應用程序,需要將其擴展20次。SQLAlchemy/SQLSoup在MySQL中看不到臨時表

一個查詢速度非常慢,所以我重新載入它。由於MySQL在嵌套子查詢/派生表上的性能不佳,我將它分成兩個臨時表並加入這些表。

現在我正在嘗試將SQL添加到代碼中,但是當我嘗試訪問臨時表時,出現錯誤,指出表不存在。

db.execute("""DROP TABLE IF EXISTS next_requests""") ; 
db.execute(""" 
     CREATE TEMPORARY TABLE next_requests 
       (INDEX request_id_index (cirId)) 
     SELECT DISTINCT 
      cr.uuid    AS cirId, 
      ....") 

db.execute("SELECT * FROM next_requests") 

現在我得到的錯誤:

ProgrammingError: (ProgrammingError) (1146, "Table 'SAST.next_requests' (doesn't exist") 

我想這是因爲會話被關閉和一些查詢之間重新制作的通訊資料,或類似的。

數據庫連接如下。

ENGINE = create_engine(settings.dbString, pool_recycle=1800, pool_size=5) 
SESSION = scoped_session(sessionmaker(autoflush=True,\ 
    expire_on_commit=False, autocommit=True)) 
SQLSOUP_DB = sqlsoup.SQLSoup(ENGINE, session=SESSION) 

(SQLSOUP_DB是db.execute中使用的db)。

我需要做些什麼來保持會話打開,以便我仍然可以使用臨時表。或者它可能是導致此問題的其他因素?

+0

怎麼樣,如果我們專注於實際的查詢,並在所有 – Drew

+0

沒有臨時表的一半左右,我花的最後一天,怎麼做,和它的一個衆所周知的問題是,MySQL沒有按不適合嵌套子查詢/派生表,因爲它沒有爲它們編制索引。 –

+0

它會適合上面這裏點擊這個[編輯] – Drew

回答

0

好的,我必須使用會話。包裹SQL語句,像這樣:

session = database.SESSION 
with session.begin() : 
    database.execute("Create Temporary Table.....") 
    database.execute("Create Temporary Table2.....")