如何批量赋值 SA ORM 对象属性?
我有一个通过ORM映射的对象,想要更新它。我已经把所有的属性都验证过了,并且安全地放在一个字典里(关键字参数)。现在我想把字典里的所有属性更新到这个对象上。
for k,v in kw.items():
setattr(myobject, k, v)
这样做不行,会报错(AttributeError异常),这个错误是SQLAlchemy抛出来的。
myobject.attr1 = kw['attr1']
myobject.attr2 = kw['attr2']
myobject.attr3 = kw['attr3']
而且那种代码复制粘贴的方式太糟糕了,我想避免这样。
我该怎么做呢?SQLAlchemy在它们的构造函数中已经做了类似的事情(比如 myobject = MyClass(**kw)),但是我在那些复杂的元编程代码里找不到相关的内容。
来自SQLAlchemy的错误:
<< 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 个回答
4
在编程中,有时候我们需要处理一些数据,比如从一个地方获取数据,然后在另一个地方使用这些数据。这个过程就像是把水从一个水桶倒到另一个水桶里。
有些时候,我们需要确保在把水倒进去之前,先把原来的水桶里的水倒掉,这样才能保证新倒进去的水是干净的。在编程中,这种情况就叫做“清理”或“重置”。
另外,编程中还有一个概念叫做“变量”,可以把它想象成一个装东西的盒子。我们可以把数据放进这个盒子里,也可以随时把盒子里的东西拿出来或者换掉。
总之,编程就是在不断地处理数据,确保我们用到的数据是最新的、最干净的。希望这个解释能帮助你更好地理解编程中的一些基本概念!
myobject.__dict__.update(**kw)
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")