relâcher la poignée de TurboGears2 sur DB spécifique (commande du gestionnaire de transaction)

StackOverflow https://stackoverflow.com/questions/8369293

Question

Je construis une application Turbogears qui fonctionne avec 2 db - la seconde - que je fais référence est un MSSQL db - utilisé par une autre application (pas à moi - ma demande est en fait un hack pour résoudre un problème - donc je ne peux pas contrôler l'autre application ou les paramètres db MSSQL)

Je vous écris à une table db spécifique avec sqlalchemy (par Turbogears) en utilisant:

 DBSession.add(object)
 DBSession.flush()

les données sont écrites à la db - mais l'application Turbogears conserve une sorte de poignée sur le db, donc la principale applicaion utilisant cette table db peut lire mais ne peut pas le changer. jusqu'à ce que j'arrête l'application Turbogears puis tout fonctionne. J'ai essayé d'appeler:

DBSession.close()

mais les données ont été supprimées de la magie db - probablement une annulation de la transaction. J'ai aussi essayé d'appeler:

transaction.doom()

avec des effets similiar (ou pas d'effet du tout, je ne suis pas sûr)

Je l'ai lu dans Turbogears le gestionnaire de transactions (je suppose que repoze.tm) gère les commits mais je ne peux pas comprendre - quand est-il appelé? comment puis-je contrôler? et surtout comment enlever la poignée db lorsque la fonction terminée, il Courons prévu (je ne peux pas terminer juste le script, il est une tâche cron, en cours d'exécution toutes les heures). les tg2.1 docs est très clair sur ce sujet

J'ai aussi lu quelque part que je devrais remplacer le commit_veto - mais ne comprenait pas - comment dois-je faire et où? et où, dans ma demande que je devrais appeler le transaction.abort () .doom () ou quoi?

J'ai essayé également les mêmes fonctions à l'aide de crochets de transaction, mais n'a pas réussi à appeler en fait le crochet

Merci pour toute aide.

données de version:

  • Turbogears 2.1.3
  • sqlalchemy 0,7
  • MSSQL 2005
  • à l'aide pyodbc pour se connecter à MSSQL
Était-ce utile?

La solution

DBSession.flush() exécute SQL, mais ne commet pas. Vous devez appeler DBSession.commit() à la transaction d'arrivée (pas besoin de flush() explicitement appel dans ce cas, commit() le fera). Après commit() SQLAlchemy commence nouvelle transaction, mais cela ne devrait pas être un problème puisque les données sont généralement verrouillée que lorsque vous exécutez une instruction SQL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top