gpt4 book ai didi

python - 使用 SQLAlchemy ORM 更新行

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:45 24 4
gpt4 key购买 nike

注意:我这里没有使用 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

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

最佳答案

我相信您正在为您的更新查询寻找类似的东西:

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

因为 update() 属于 Query ,并且 filter() 确实返回一个 Query 对象,这将起作用,这与尝试在您的 FoobarModel 上调用 update() 相反 Query.get() 返回的对象(没有这样的函数),see also here .

至于遍历您的属性并按名称分配它们,您可以使用 setattr 和一个字典来完成,如下所示:

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()

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

关于python - 使用 SQLAlchemy ORM 更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47735329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com