2010-03-24 62 views
4

我正在編寫一個使用Bottle和SqlAlchemy的小型WSGI應用程序,並且對我的應用程序的「佈局」應該如何根據SqlAlchemy感到困惑。使用WSGI應用程序的sqlalchemy佈局

我的困惑在於創建引擎和會話。我的理解是,我應該只使用'create_engine'方法創建一個引擎。我應該以某種單例模式在全局命名空間中創建一個引擎實例,並根據它創建會話嗎?你在項目中如何做到這一點?

任何有識之士將不勝感激。文檔中的例子似乎並沒有使這個完全清楚(除非我錯過了一些明顯的東西)。有什麼想法嗎?

回答

6

你需要什麼來實現掛架文檔中有很好的描述:Defining Tables and ORM classes

該模型包含兩個文件:__init__.py和meta.py. __init__.py包含您的表定義和ORM類以及必須在應用程序啓動時調用的init_model()函數。 meta.py僅僅是SQLAlchemy的管家對象(會話,元數據和引擎)的容器,並非所有的應用程序都會使用它。

__init__.py的例子所示鏈接,而meta.py類似於此:

from sqlalchemy import MetaData 
from sqlalchemy.orm import scoped_session, sessionmaker 
__all__ = ['Session', 'engine', 'metadata'] 
engine = None 
Session = scoped_session(sessionmaker()) 
metadata = MetaData() 

,如果你願意的話,可以考慮一下這款模塊singleton實現,因爲它會做的工作(加載並且在更多Pythonic中)爲您加載模塊。

2

您不必手動創建引擎。對於Web應用程序,最好使用有效的線程本地會話,在單個請求期間使用。

from sqlalchemy import MetaData 
from sqlalchemy.orm import scoped_session, sessionmaker 

session = scoped_session(sessionmaker()) 
metadata = MetaData('sqlite://') # or whatever: creates the engine for you 

發動機將作爲metadata.bind提供。 您不需要將會話綁定到引擎 - 它是可選的,請參閱here