Rilascio di Turbogears2 Handle su DB specifico (controllo del gestore delle transazioni)
-
27-10-2019 - |
Domanda
Sto costruendo un'applicazione Turbogears che funziona con 2 dB - la seconda - a cui mi riferisco è un DB MSSQL - usato da un'altra applicazione (non la mia - la mia applicazione è in realtà un hack per risolvere un problema - così posso 'T Controlla l'altra applicazione o le impostazioni MSSQL DB)
Sto scrivendo su una tabella DB specifica con sqlalchemy (tramite turbogears) usando:
DBSession.add(object)
DBSession.flush()
I dati sono scritti su DB, ma l'applicazione Turbogears mantiene una sorta di handle sul DB, quindi l'applicazione principale usando quella tabella DB può leggerlo ma non può cambiarlo. Fino a quando non fermo l'applicazione Turbogears e poi tutto funziona. Ho provato a chiamare:
DBSession.close()
Ma poi i dati sono stati magicamente rimossi dal DB, probabilmente un rollback delle transazioni. Ho anche provato a chiamare:
transaction.doom()
Con effetti simili (o nessun effetto non sono sicuro)
Ho letto che in Turbogears il gestore delle transazioni (immagino che repoze.tm) gestisca gli commit ma non riesco a capire - quando viene chiamato? Come lo controllo? E soprattutto come rimuovere la maniglia DB quando la funzione ha terminato la sua corsa (non posso semplicemente terminare lo script, è un lavoro cron, in esecuzione ogni ora). I documenti TG2.1 non sono molto chiari su questo argomento
Ho anche letto da qualche parte che dovrei sovrascrivere il commit_veto - ma non ho capito - come dovrei farlo e dove? E dove nella mia applicazione dovrei chiamare la transazione.abort () .doom () o altro?
Ho anche provato le stesse funzioni usando i ganci delle transazioni ma non sono riuscito a chiamare davvero il gancio
Grazie per qualsiasi aiuto.
Dati della versione:
- Turbogears 2.1.3
- Sqlalchemy 0.7
- MSSQL 2005
- Utilizzando PyODBC per connettersi a MSSQL
Soluzione
DBSession.flush()
Esegue SQL, ma non si impegna. Devi chiamare DBSession.commit()
Per finire la transazione (non è necessario chiamare esplicitamente flush()
in questo caso, commit()
lo farà). Dopo commit()
SQLALCHEMY inizia una nuova transazione, ma questo non dovrebbe essere un problema poiché i dati sono generalmente bloccati solo quando si eseguono qualche istruzione SQL.