2014-02-12 124 views
30

按照我們在How to close sqlalchemy connection in MySQL中所評論的內容,我正在檢查SQLAlchemy創建的連接到我的數據庫中,並且無法在不退出Python的情況下關閉它們。如何關閉SQLAlchemy會話?

如果我運行在Python控制檯這段代碼,它保持打開,直到我退出的Python會話:

from sqlalchemy.orm import sessionmaker 
from models import OneTable, get_engine 

engine = get_engine(database="mydb") 
session = sessionmaker(bind=engine)() 

results = session.query(OneTable.company_name).all() 

# some work with the data # 

session.close() 

,我發現關閉它是在最後調用engine.dispose()唯一的解決方法。

按照中的鏈接我上面給的意見,我的問題現在:

  • 爲什麼有必要關閉會話engine.dispose()
  • 是否不夠session.close()夠用?
+1

使用'sqlalchemy.pool.NullPool'不能解決您的問題嗎? –

+0

嗯@xndrme,我該如何使用它? – fedorqui

+0

我希望這兩個鏈接可以幫助您http://docs.sqlalchemy.org/en/rel_0_8/glossary.html?highlight=release和http://docs.sqlalchemy.org/en/rel_0_8/core/pooling.html? highlight = pooling#switching-pool-implementation –

回答

42

這裏有一箇中央混淆單詞「會話」。我不確定在這裏,但看起來好像你可能會混淆SQLAlchemy SessionMySQL @@session,它指的是當你第一次連接到MySQL和斷開連接時的範圍。

這兩個概念是不一樣。一個SQLAlchemy會話通常代表一個或多個事務的範圍,根據特定的數據庫連接。

因此,按字面順序詢問的問題的答案是致電session.close(),即「如何正確關閉SQLAlchemy會話」。

但是,您的其餘問題表明您希望某些功能可以在特定的Session關閉時讓您關閉實際的DBAPI連接。

什麼這基本上意味着,您希望禁用connection pooling。作爲其他答案提及,很容易,use NullPool

+2

這完全實現了它。通過你指出它,我注意到我正在混合SQLAlchemy和MySQL會話。現在使用'get_engine(database =「mydb」,poolclass = NullPool)'''session.close()'後我就關閉它了。非常感謝! – fedorqui

+0

我想我有一個問題,因爲會議沒有正常關閉。我的API給我隨機數行。例如我的表中有10行(mysql)。當我打我的API時,我得到了10,0,9等結果。附:我使用sqlalchemy(不是燒瓶sqlalchemy)。請指導我。 – Hussain

24

session.close()會給連接返回到發動機的連接池,不會關閉連接。

engine.dispose()將關閉連接池中的所有連接。如果設置poolclass=NullPool

引擎將不會使用連接池。所以連接(SQLAlchemy會話)將在session.close()之後直接關閉。