【问题标题】:Updating a row using SQLAlchemy ORM使用 SQLAlchemy ORM 更新一行
【发布时间】:2018-05-23 22:29:46
【问题描述】:

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

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

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

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

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

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

    【讨论】:

    • +1 对您的答案进行了所有出色的修改。这就是问题所在。当我应该使用.filter() 时,我使用了.get()。谢谢!
    【解决方案2】:

    工作

    device = models.Device.query.filter(models.Device.device_identifier == device_identifier).first()
    
    setattr(device, 'updated_at', datetime.now())
    setattr(device, 'ip_address', ip_address)
    db.session.commit()
    

    没用

    device.is_active = True
    device.id_address = ip_address
    device.updated_at = datetime.now()
    print(device.ip_address)
    db.session.commit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-18
      • 2010-09-21
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多