2015-04-23 5 views
6

Gibt es eine Möglichkeit, ein von sqlalchemy zugeordnetes Objekt zu erzwingen dirty? Zum Beispiel wird der Kontext der sqlalchemy des Object Relational Tutorial das Problem gegeben demonstriert,Force-Objekt zu sein "schmutzig" in Sqlalchemy

a=session.query(User).first() 
a.__dict__['name']='eh' 
session.dirty 

nachgebend,

IdentitySet([]) 

ich für eine Art und Weise suchen die Benutzer a in einem schmutzigen Zustand zu zwingen.

Dieses Problem tritt auf, weil die Klasse, die mithilfe von sqlalchemy zugeordnet wird, die Kontrolle über die Getter/Setter-Methoden übernimmt, wodurch verhindert wird, dass sqlalchemy Änderungen registriert.

Antwort

13

Ich stieß vor kurzem auf das gleiche Problem und es war nicht offensichtlich.

Objekte selbst sind nicht schmutzig, aber ihre Attribute sind. Da SQLAlchemy nur geänderte Attribute zurückschreibt, nicht das gesamte Objekt, soweit ich weiß.

Wenn Sie ein Attribut mit set_attribute gesetzt und es unterscheidet sich von den ursprünglichen Attributdaten, SQLAlchemy das Objekt gründet heraus ist schmutzig (TODO: Ich brauche Details, wie es der Vergleich der Fall ist):

from sqlalchemy.orm.attributes import set_attribute 
    set_attribute(obj, data_field_name, data) 

Wenn Sie will das Objekt markieren schmutzig unabhängig von dem ursprünglichen Attributwert, unabhängig davon, ob es oder nicht geändert hat, verwenden flag_modified:

from sqlalchemy.orm.attributes import flag_modified 
    flag_modified(obj, data_field_name) 
+0

Diese Antwort scheint jedoch riskant zu sein, wenn Sie das Attribut als geändert markieren, aber in state_dict keinen Zustand dafür haben, wird KeyError ausgelöst. site-packages/sqlalchemy/orm/persistence.py ", Zeile 454, in _collect_update_commands value = state_dict [propkey] – Drachenfels

+0

Danke! Ist es möglich, die Primärschlüssel-ID auch mithilfe des Attributs set zu ändern? –

0

der flag_modified Ansatz funktioniert, wenn man das Attribut kennt einen Wert pre hat geschickt. SQLAlchemy-Dokumentation states:

Markieren Sie ein Attribut für eine Instanz als 'geändert'.

Dadurch wird das Flag "Modified" für die Instanz gesetzt und ein bedingungsloses Änderungsereignis für das angegebene Attribut festgelegt. Das Attribut muss einen Wert vorhanden haben, andernfalls wird ein InvalidRequestError ausgelöst.

Ab Version 1.2, wenn man will, eine ganze Instanz dann flag_dirty markieren ist die solution:

Mark eine Instanz als ‚schmutzig‘ ohne spezifische Attribute genannt.

Verwandte Themen