我使用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]
答案 0 :(得分:5)
金字塔文档包含tutorial on integrating Pyramid with 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上提交,例外回滚。
答案 1 :(得分:3)
我认为sqlalchemy doc示例声明它们是简洁的全局,而不是表明他们建议这样做。
我认为您真正想要传递给应用程序不同部分的唯一事情是Session对象。更简单的选择是使用scoped session(我似乎记得O'Reilly sqlalchemy书实际上建议使用更简单的基于Web的应用程序;您的代码表明它是一个Web应用程序)。我认为除了实例化数据库连接之外,在任何位置都需要引擎或元数据的应用程序非常少。
在应用启动时(在金字塔的情况下,在主要功能here中)创建引擎和元数据时,也会创建范围会话。然后,您将其作为参数传递给需要数据库访问的应用程序的各个部分。