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)))
È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top