7

我正在使用 sqlalchemy 表达式语言的表示法和连接池来创建 dao 对象以与持久层进行通信。我想就如何设置元数据和引擎获得一些意见,以便它们可用于应用程序视图可调用对象。根据 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]
4

2 回答 2

5

Pyramid 文档包括有关将 Pyramid 与 SQLAlchemy 集成的教程

有两个特殊的包将 SQLAlchemy 事务和会话管理与 Pyramid 集成在一起,pyramid_tm以及zope.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 上提交,在异常时回滚。

于 2012-08-11T07:51:15.457 回答
3

我认为 sqlalchemy 文档示例为了简洁而将它们声明为全局,而不是表示它们建议这样做。

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

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

于 2012-08-11T07:41:15.750 回答