如何批量分配SA ORM对象属性?

时间:2009-08-26 11:50:32

标签: python sqlalchemy

我有一个ORM映射对象,我想要更新。我在字典中验证并保护了所有属性(关键字参数)。现在我想更新字典中的所有对象属性。

for k,v in kw.items():
    setattr(myobject, k, v)

不起作用(AttributeError Exception),从SQLAlchemy抛出。

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

等是可怕的复制粘贴代码,我想避免这种情况。#

我怎样才能做到这一点? SQLAlchemy已经做了类似于我想在其构造函数中做的事情(myobject = MyClass(** kw)),但我发现在所有元编程中混淆了垃圾。

来自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'

2 个答案:

答案 0 :(得分:3)

您正在尝试将unicode字符串分配给关系属性。说你有:

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

你正在尝试:

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

当你应该做的时候:

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

答案 1 :(得分:2)

myobject.__dict__.update(**kw)