Frage

Ich baue eine Turbogears -Anwendung, die mit 2 dB funktioniert - die zweite - auf die ich mich beziehe, ist eine MSSQL -DB - von einer anderen Anwendung verwendet (nicht meine - meine Anwendung ist tatsächlich ein Hack, um ein Problem zu lösen - damit ich kann, also kann ich 't steuern die andere Anwendung oder die MSSQL -DB -Einstellungen)

Ich schreibe in eine bestimmte DB -Tabelle mit SQLAlchemy (durch Turbuears) mit:

 DBSession.add(object)
 DBSession.flush()

Die Daten werden in die DB geschrieben - aber die Turbogears -Anwendung behält eine Art Griff für die DB bei, sodass die Hauptanwendung, die diese DB -Tabelle unter Verwendung dieser DB -Tabelle, daraus lesen kann, aber nicht ändern kann. Bis ich die Turbogears -Anwendung stoppe und dann funktioniert alles. Ich habe versucht anzurufen:

DBSession.close()

Aber dann wurden die Daten magisch aus dem DB entfernt - wahrscheinlich ein Transaktionsrollback. Ich habe auch versucht anzurufen:

transaction.doom()

Mit ähnlichen Effekten (oder überhaupt keine Wirkung, ich bin mir nicht sicher)

Ich habe gelesen, dass der Transaktionsmanager (ich denke, Repoze.tm) mit den Commits verarbeitet, aber ich kann es nicht schaffen - wann heißt es? Wie kontrolliere ich es? Und vor allem, wie Sie den DB -Handle entfernen, wenn die Funktion abgeschlossen ist, ist der geplante Lauf (ich kann das Skript nicht einfach beenden, es ist ein Cron -Job, der jede Stunde läuft). Die TG2.1 -Dokumente sind in diesem Thema sehr unklar

Ich habe auch irgendwo gelesen, wo ich den commiting_veto überschreiben sollte - aber nicht verstanden - wie soll ich das tun und wo? Und wo sollte ich in meiner Bewerbung die Transaktion nennen.abort () .doom () oder was auch immer?

Ich habe auch die gleichen Funktionen mit Transaktionshaken ausprobiert, aber es hat mir nicht gelungen, den Haken tatsächlich anzurufen

Danke für jede Hilfe.

Versionsdaten:

  • Turbuears 2.1.3
  • Sqlalchemy 0,7
  • MSSQL 2005
  • Verwenden von PyodBC zur Verbindung zu MSSQL
War es hilfreich?

Lösung

DBSession.flush() führt SQL aus, verpflichtet sich aber nicht. Sie müssen anrufen DBSession.commit() Um die Transaktion abzuschließen (müssen nicht explizit anrufen flush() in diesem Fall, commit() werde es tun). Nach commit() SQLalchemy startet eine neue Transaktion, dies sollte jedoch kein Problem sein, da Daten normalerweise nur gesperrt werden, wenn Sie eine SQL -Anweisung ausführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top