使用SQLAlchemy ORM更新行

2024-09-27 09:22:04 发布

您现在位置:Python中文网/ 问答频道 /正文

注意:这里我没有使用Flask SQLAlchemy,而是使用SQLAlchemy ORM

我在StackOverflow上看到几个答案,说这是一种更新记录的方法:

session.query(FoobarModel).get(foobar_id).update({'name': 'New Foobar Name!'})

但是我有个错误说:

AttributeError: 'FoobarModel' object has no attribute 'update'

不过,我可以这样更新:

foobar = session.query(FoobarModel).get(foobar_id)
foobar.name = 'New Foobar Name!'
session.commit()
session.flush()

所以我尝试了这样的方法(这样我就不必把所有的财产都写出来):

new_foobar = {'name': 'New Foobar Name!'}
old_foobar = session.query(FoobarModel).get(foobar_id)

for property in new_foobar:
  old_foobar[property] = new_foobar[property]

session.commit()
session.flush()

但是我得到了这个错误:

TypeError: 'FoobarModel' object does not support item assignment

在做了一些挖掘之后,我发现这是因为即使这样也行不通:

print(old_foobar['name'])

从而引发错误:

TypeError: 'FoobarModel' object is not subscriptable

老实说,第一种语法在我看来是最好的,但我不能让它起作用。有什么想法吗?


Tags: nameidnewgetobjectsession错误property
1条回答
网友
1楼 · 发布于 2024-09-27 09:22:04

我相信您正在为更新查询查找类似的内容:

session.query(FoobarModel).filter(FoobarModel.id == foobar_id).update({'name': 'New Foobar Name!'})

由于update()属于Query,并且filter()返回的是Query对象,这将起作用,而不是试图对Query.get()see also here返回的FoobarModel对象(它没有这样的函数)调用update()

至于循环遍历属性并按名称分配属性,可以使用setattr和dict来完成,如下所示:

foobar = session.query(FoobarModel).get(foobar_id)

props = {'name': 'my new name'}

for key, value in props.items():
    setattr(foobar, key, value)

session.commit()
session.flush()

这显然有点毫无意义,只有一个属性,但也许它会在某个时候派上用场。

相关问题 更多 >

    热门问题