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

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.

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