为视图callables设置sqlalchemy连接的推荐方法是什么?

时间:2012-08-11 07:29:51

标签: python sqlalchemy pyramid

我使用sqlalchemy表达式语言作为其表示法和连接池来创建用于与持久层通信的dao对象。我希望得到一些关于如何设置元数据和引擎的意见,以便它们可用于应用程序视图callables。根据sqlalchemy的文档http://docs.sqlalchemy.org/en/rel_0_7/core/connections.html,它们通常被绑定并声明为全局,但是我没有这个或单身方法都是好主意。任何想法都将不胜感激......

这是我的__init__.py文件在我的项目目录中的样子:

from pyramid.config import Configurator
from sqlalchemy import engine_from_config, MetaData, create_engine
from pyramid_beaker import session_factory_from_settings

db_url = 'postgresql://user:password@localhost/dbname'
engine = create_engine(db_url)
meta = MetaData()

def main(global_config, **settings):
    meta.bind = engine
    .
    .
    .
    [other configuration settings]

2 个答案:

答案 0 :(得分:5)

金字塔文档包含tutorial on integrating Pyramid with SQLAlchemy

有两个特殊的软件包可以将SQLAlchemy事务和会话管理与Pyramid pyramid_tmzope.sqlalchemy集成在一起。这些一起照顾你的会议:

from sqlalchemy import engine_from_config

from .models import DBSession

def main(global_config, **settings):
    """This function returns a Pyramid WSGI application."""

    engine = engine_from_config(settings, 'sqlalchemy.')
    DBSession.configure(bind=engine)
    # Configuration setup

这里我们从.ini配置文件中获取配置设置;并在models.py

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    )

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

class YourModel(Base):
    # Define your model

请注意在那里使用scoped_session,使用事务扩展来与Pyramid集成。

然后在视图中,您需要做的就是使用DBSession会话工厂来获取会话:

from pyramid.view import view_config
from .models import (
    DBSession,
    YourModel,
    )

@view_config(...)
def aview(request):
    result = DBSession.query(YourModel).filter(...).first()

提交和回滚将与请求集成;例如,在2xx和3xx上提交,例外回滚。

答案 1 :(得分:3)

我认为sqlalchemy doc示例声明它们是简洁的全局,而不是表明他们建议这样做。

我认为您真正想要传递给应用程序不同部分的唯一事情是Session对象。更简单的选择是使用scoped session(我似乎记得O'Reilly sqlalchemy书实际上建议使用更简单的基于Web的应用程序;您的代码表明它是一个Web应用程序)。我认为除了实例化数据库连接之外,在任何位置都需要引擎或元数据的应用程序非常少。

在应用启动时(在金字塔的情况下,在主要功能here中)创建引擎和元数据时,也会创建范围会话。然后,您将其作为参数传递给需要数据库访问的应用程序的各个部分。