Problema di sqlalchemy quando si estende l'applicazione della piramide
-
28-10-2019 - |
Domanda
Ho una "applicazione principale", e in questa applicazione ho quanto segue in dentro.py file:
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')
E in The Views.py ho:
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}
E poi ho una nuova applicazione, che voglio estendere.
Quindi nel dentro.py ho fatto:
from mainapp import site_configs
def main(global_config, **settings):
# various config settings
config.include(site_configs)
Ma quando eseguo questa nuova applicazione, ottengo il seguente errore (Traceback completo in fondo a questo messaggio):
UnboundExecutionError: Could not locate a bind configured on mapper
Mapper|projects|projects, SQL expression or this Session
Il motore SQLalchemy è stato impostato correttamente in entrambe le applicazioni.
Anche quello che voglio fare è utilizzare il database nella nuova applicazione e non quello nell'applicazione principale originale.
----------------------------
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)))
Soluzione
Bene, questo non ha davvero nulla a che fare con la piramide. Hai una variabile globale dbsession
che stai tentando di condividere tra diverse sotto -app della tua applicazione. Se il modello è lo stesso per tutte le tue applicazioni, dovresti avere solo una singola funzione di inizializzazione per configurare il tuo globale nel main()
. Se hai modelli diversi per diversi subapp che vanno bene, ma non dovresti davvero provare a spingerli tutti nello stesso globale in modo sovrapposto, che è quello che sembra accadere qui. Forse puoi essere più specifico su come intendi funzionare?