Frage

Ich habe ein einfaches Problem in SQLAlchemy. Ich habe ein Modell in einer Tabelle, nennen wir es Modell1 hier. Ich möchte eine Zeile in dieser Tabelle hinzuzufügen, und erhalten die autoinkrementierten Schlüssel, so kann ich ein anderes Modell mit ihm erstellen und diesen Schlüssel verwenden. Dies ist nicht ein fehlerhafter Datenbank-Design (1: 1-Beziehung usw.). Ich brauche einfach diesen Schlüssel in einer anderen Tabelle, weil die andere Tabelle zu einem Remote-Host übertragen werden, und ich brauche die passenden Schlüssel, so dass die Server sie verstehen. Es wird kein weiterer lokaler Bezug zwischen diesen zwei Tabellen sein, und es ist auch nicht möglich, Beziehungen zu schaffen, weil das.

Betrachten Sie den folgenden Code ein:

object1 = model.Model1(param)
DBSession.add(object1)

# if I do this, the line below fails with an UnboundExecutionError.
# and if I dont do this, object1.id won't be set yet
#transaction.commit()

object2 = model.AnotherModel(object1.id) #id holds the primary, autoincremented key

Ich wünschte, ich würde nicht einmal „von Hand“ zu begehen. Im Grunde, was würde Ich mag es, zu erreichen „Modell1“ wächst ständig, mit Model.id Primärschlüssel zu erhöhen. AnotherModel ist immer nur ein kleiner Bruchteil Modell1, die noch nicht verarbeitet wurde. Natürlich bereits bearbeiteten Elemente zu markieren, könnte ich eine Flagge in „Modell1“, ein boolean Feld in der Tabelle hinzufügen, aber ich habe gehofft, dies wäre nicht notwendig.

Wie kann ich meine obigen Code zu arbeiten?

Greets,

Tom

War es hilfreich?

Lösung

Ein paar Dinge:

  • Könnten Sie bitte erklären, was der Variable transaction gebunden wird?
  • Genau das, was Aussage wirft die UnboundExecutionError?
  • Bitte geben Sie die vollständige Ausnahmemeldung, einschließlich Stack-Trace.
  • Das ‚normale‘, was in diesem Fall zu tun, wäre DBSession.flush() zu nennen. Haben Sie versucht das?

Beispiel:

object1 = Model1(param)
DBSession.add(object1)
DBSession.flush()
assert object1.id != None # flushing the session populates the id

object2 = AnotherModel(object1.id)

Für eine große Erklärung für die Sitzung SA und welche flush() hat, finden Sie unter Verwendung die Session .

Im Wesentlichen verursacht flush() Instanzen Bis Persistent werden - was bedeutet, dass neue Objekte in die Datenbanktabellen eingefügt werden. flush() auch aktualisiert die Tabellen mit den Werten für die Fälle, dass die Session-Tracks, die Änderungen hat.

commit() immer Probleme flush() zuerst.

Innerhalb einer Transaktion können Sie mehrmals spülen. Jede flush () verursacht UPDATEs und / oder Einfügungen in der Datenbank. Die gesamte Transaktion kann wieder begangen oder gerollt werden.

Andere Tipps

Wenn Sie wollen neue Primärschlüsselkennungen kennen zu erzeugen, ohne etwas begangen werden, rufen Sie einfach session.flush (). Das wird emittieren alles anhängig in die Datenbank in der aktuellen Transaktion.

ich nur diese mit Foreign verwendet haben, so dass Sie im zweiten Fall eher model.AnotherModel tun würde (model1 = object1) und dann funktionierte es nur (tm). Also ich vermute, dies ist ein Problem mit dem Modell sein kann, vielleicht könnte man sich schreiben?

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