扩展Pyramid应用时的SQLalchemy问题

3 投票
1 回答
1708 浏览
提问于 2025-04-17 01:59

我有一个“主应用程序”,在这个应用程序的 init.py 文件里,我写了以下内容:

def main(global_config, **settings):
    # various config settings
    config.include(site_configs)

def site_configs(config):
    config.add_route('portfolio', '/portfolio', 
    view='mainapp.views.portfolio',   
    view_renderer='/site/portfolio.mako')

在 views.py 文件里,我写了:

def portfolio(request):
    ## some code here
    project_records = dbsession.query(projects).from_statement(
        'SELECT * FROM projects ORDER by id DESC').all()

return {'project_records': project_records}

然后我又创建了一个新应用程序,想要在这个新应用上进行扩展。

所以在 init.py 文件里,我写了:

from mainapp import site_configs

def main(global_config, **settings):
    # various config settings
    config.include(site_configs)

但是当我运行这个新应用程序时,出现了以下错误(完整的错误信息在这条消息的底部):

UnboundExecutionError: Could not locate a bind configured on mapper 
Mapper|projects|projects, SQL expression or this Session

这两个应用程序的 sqlalchemy 引擎都已经正确设置好了。

另外,我想在新应用程序中使用数据库,而不是使用原主应用程序中的数据库。

----------------------------
Full Traceback
----------------------------

URL: http://127.0.0.1:6543/portfolio
Module weberror.evalexception:431 in respond         view
>>  app_iter = self.application(environ, detect_start_response)
Module repoze.tm:23 in __call__         view
>>  result = self.application(environ, save_status_and_headers)
Module pyramid.router:158 in __call__         view
>>  response = view_callable(context, request)
Module pyramid.config:2824 in _rendered_view         view
>>  response = wrapped_view(context, request)
Module pyramid.config:2916 in _requestonly_view         view
>>  response = view(request)
Module mainapp.views:62 in portfolio         view
>>  project_records = dbsession.query(projects).from_statement('SELECT * FROM projects ORDER by id DESC').all()
Module sqlalchemy.orm.query:1579 in all         view
>>  return list(self)
Module sqlalchemy.orm.query:1689 in __iter__         view
>>  return self._execute_and_instances(context)
Module sqlalchemy.orm.query:1694 in _execute_and_instances         view
>>  mapper=self._mapper_zero_or_none())
Module sqlalchemy.orm.session:717 in execute         view
>>  engine = self.get_bind(mapper, clause=clause, **kw)
Module sqlalchemy.orm.session:853 in get_bind         view
>>  ', '.join(context)))

1 个回答

2

其实这跟Pyramid没什么关系。你有一个全局变量 dbsession,你想在应用程序的不同子应用之间共享它。如果你的所有应用使用的是相同的模型,那你只需要在 main() 函数里写一个初始化的函数来配置这个全局变量就可以了。如果不同的子应用有不同的模型也没问题,但你真的不应该把它们都强行放到同一个全局变量里,这样会导致混乱。听起来你可能正是这样做的。也许你可以更具体地说明一下你想要怎么实现这个功能?

撰写回答