WSGI应用中的Sqlalchemy布局
我正在用Bottle和SqlAlchemy写一个小的WSGI应用,但对SqlAlchemy的“布局”有点困惑。
我不太明白如何创建引擎和会话。我理解的是,我应该只用'create_engine'方法创建一个引擎。我是不是应该在全局范围内创建一个引擎实例,采用某种单例模式,然后基于这个引擎创建会话?你们在项目中是怎么做的?
任何见解都很受欢迎。文档中的例子似乎没有完全解释清楚这个问题(除非我漏掉了什么明显的东西)。你们有什么想法吗?
2 个回答
2
你不需要手动创建一个引擎。对于网页应用来说,最好使用一个“范围会话”,这实际上是一个线程本地的东西,用于处理单个请求。
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
来获取。你不需要把会话和引擎绑定在一起——这不是必须的,具体可以查看 这里。
6
你需要实现的内容在pylons的文档中有详细说明:定义表和ORM类:
这个模型由两个文件组成:
__init__.py
和meta.py。__init__.py
里包含了你的表定义和ORM类,还有一个在应用启动时必须调用的init_model()函数。meta.py只是用来存放SQLAlchemy的一些管理对象(比如Session、metadata和engine),并不是所有应用都会用到这些。
__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的风格。