Проблема SQLalchemy при расширении приложения Pyramid - PullRequest
3 голосов
/ 11 сентября 2011

У меня есть «Основное приложение», и в этом приложении у меня есть следующее в 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 голосов
/ 13 сентября 2011

Ну, это действительно не имеет ничего общего с Пирамидой.У вас есть глобальная переменная dbsession, которую вы пытаетесь разделить между различными подпапами вашего приложения.Если модель одинакова для всех ваших приложений, то у вас должна быть только одна функция инициализации, чтобы настроить глобальное значение в main().Если у вас есть разные модели для разных подпапок, это нормально, но вы действительно не должны пытаться толкнуть их всех в один и тот же глобал в наложении друг на друга, как это здесь и происходит.Может быть, вы можете более конкретно рассказать о том, как вы собираетесь это работать?

...