2009-08-26 3 views
1

Ich habe ein ORM zugeordnetes Objekt, das ich aktualisieren möchte. Ich habe alle Attribute validiert und gesichert in einem Wörterbuch (Schlüsselwortargumente). Jetzt möchte ich alle Objektattribute wie im Wörterbuch aktualisieren.Wie kann ich SA ORM-Objektattribute massenweise zuweisen?

funktioniert nicht (AttributeError Exception), von SQLAlchemy geworfen.

myobject.attr1 = kw['attr1'] 
myobject.attr2 = kw['attr2'] 
myobject.attr3 = kw['attr3'] 

etc ist schrecklich kopieren und einfügen Code, möchte ich das vermeiden. #

Wie kann ich das erreichen? SQLAlchemy macht schon etwas, was ich in ihren Konstruktoren machen möchte (myobject = MyClass (** kw)), aber ich kann nicht finden, dass in allen Metaprogrammen Mist drin ist.

Fehler von SA:

<<   if self.trackparent: 
        if value is not None: 
         self.sethasparent(instance_state(value), True) 
        if previous is not value and previous is not None: 
         self.sethasparent(instance_state(previous), False) 
>> self.sethasparent(instance_state(value), True) 
AttributeError: 'unicode' object has no attribute '_sa_instance_state' 
+0

die Schlüssel in Ihrem Wörterbuch Unicode-Objekte sind, und Sie laufen auf Python 2.x? Wenn das der Fall ist, ist setattr mit Unicode vielleicht nicht allzu glücklich. Nur etwas zu überprüfen. –

Antwort

3

Sie versuchen, eine Unicode-String in eine Beziehung Attribut zugewiesen werden soll. Angenommen, Sie haben:

class ClassA(Base): 
    ... 
    b_id = Column(None, ForeignKey('b.id')) 
    b = relation(ClassB) 

Und Sie versuchen zu tun:

my_object = ClassA() 
my_object.b = "foo" 

Wenn Sie sollten entweder tun:

my_object.b_id = "foo" 
# or 
my_object.b = session.query(ClassB).get("foo") 
+0

ich werde verdammt sein. Das war die Lösung. mein setattrzeug funktioniert gut, wenn ich kw ['attr1'] = Session.query (MyClass) .get (kw ['attr1']) – Tom

+0

Das erstaunliche Zeug, das ich gerade herausgefunden habe, ist auch, dass Sie tatsächlich zuweisen können int zu einem Beziehungsattribut, ich habe es gerade selbst getestet. myobject.b = 1 würde funktionieren, wenn es ein Objekt b mit id = 1 gibt. Scheint, meine Validatoren vermasselt zu haben, da die aus der Relation erhaltene ID nicht korrekt in int umgewandelt wurde, sondern als Unicode blieb. Scheint, dass SA wie ints funktioniert, aber keine Unicodes, die den Beziehungseigenschaften zugewiesen sind – Tom

+1

Seltsamerweise sollte die Zuweisung eines int zu einer Relation denselben Fehler ergeben. –

2
myobject.__dict__.update(**kw) 
+0

Hm leider funktioniert das nicht für SQLAlchemy. Das __dict__ wird korrekt aktualisiert, aber SA scheint das Objekt nicht als "dreckig" zu markieren und beharrt es auf der DB – Tom