如何批量赋值 SA ORM 对象属性?

1 投票
2 回答
1147 浏览
提问于 2025-04-15 13:53

我有一个通过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")

撰写回答