在第三方库中访问Pyramid数据库会话
我正在为Pyramid写一个库。其中一个方面是这个库需要一个模型类,然后从数据库中获取该模型的所有实例。但是,我无法在没有会话工厂的情况下与数据库进行交互。
在Django中,这些事情都是自动处理的。而在Pyramid和SQLAlchemy中,情况就不一样了。
有没有什么标准的方法让我在Pyramid中获取当前线程的数据库会话,而不需要了解特定项目的设置(因为这是一个可重用的库)?
另外,我还在努力理解SQLAlchemy的相关内容,所以如果有不清楚的地方,请多多包涵。
2 个回答
我建议你了解一下
一种将会话(session)添加到请求对象(request object)的约定。你的库只是对此做了一个假设,并在你的文档中写明了这一点。
全局会话与非全局会话
一个官方教程展示了这些概念
很多Pyramid应用程序使用zope.sqlalchemy这个包来整合应用事务管理和数据库会话管理。这种方法甚至被SQLAlchemy的文档推荐为众多选项之一。对我来说,zope.sqlalchemy的文档有点让人困惑。整体来说,这个主题对刚开始接触Pyramid和使用SQLAlchemy的线程局部会话的人来说,常常会造成困惑。
想要查看一个完整功能的Pyramid应用程序,使用了这些包,可以看看 ToDoPyramid - 这是Pyramid文档页面上列出的一个示例应用
我 克隆了这个项目,让与数据库相关的代码对我来说更容易测试和阅读。我发现这些概念运作得很好,只要数据库的环境设置得当。
你可以像 factory-boy 那样,在继承的类中把 sqla 会话指定为一个属性。
另一种方法是创建一个接口,并要求在你的应用注册表中将 sqlalchemy 会话作为工具注册,这样在“config.include”你的扩展之前就可以使用了。也许 pyramid_jinja2 会更清楚地解释这个解决方案。