我想使用Python Pyramid Framework和SQL Alchemy处理多个数据库。
我有一个包含用户信息的数据库,以及存储应用程序信息的多个数据库(具有相同的结构)。登录时的每个用户都选择一个数据库,并且只显示来自该数据库的信息(而不是其他用户)。
我应该如何构建代码?
我在考虑在会话中保存dbname,并在每个请求上检查所选数据库的用户权限并生成新的数据库会话。所以我的观点看起来像(PSEUDO CODE):
@view_config(route_name='home', renderer='json')
def my_view_ajax(request):
try:
database = int(request.GET['database'])
# check user permissions from user database
engine = create_engine('postgresql://XXX:XXX@localhost/'+database)
DBSession.configure(bind=engine)
items = DBSession.query('table').all()
except DBAPIError:
return 'error'
return items
我是否应该使用每个请求的用户信息生成新的数据库会话?或者有更好的方法吗?
由于
答案 0 :(得分:4)
这在Pyramid + SQLAlchemy中很容易做到,但你可能会想要 切换到更重的样板文件,更多手动会话管理风格,并且您希望了解SQLA的会话管理文档,因为在处理多个并发会话时您可以轻松地绊倒。此外,连接管理之类的东西应该远离视图,并且位于服务器启动生命周期中的组件中,并且跨请求线程共享。如果你在Pyramid中做得很好,你的观点应该很小,你应该有很多组件通过ZCA(注册表)一起工作。
在我的应用程序中,我有一个数据库工厂对象在被要求时获取会话,并且我在服务器启动代码(__ init __.py中的内容)中实例化这些对象并将它们保存在注册表中。然后,您可以使用reify装饰器将每个数据库的会话附加到您的请求对象,并附加一个保持请求清理方法的房屋以关闭它们。这可以通过自定义请求工厂或从init连接到请求的方法来完成,我个人最终使用自定义工厂,因为我发现它更容易阅读,我通常最终添加更多。
second