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

Jai*_*gus 7 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]
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

Pyramid文档包含有关将Pyramid与SQLAlchemy集成教程.

有迹象表明,整合SQLAlchemy的交易和会话管理金字塔两个特殊的包,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
Run Code Online (Sandbox Code Playgroud)

这里我们从.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
Run Code Online (Sandbox Code Playgroud)

注意使用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()
Run Code Online (Sandbox Code Playgroud)

提交和回滚将与请求集成; 例如,在2xx和3xx上提交,对异常进行回滚.