【问题标题】:Updating dynamically determined fields with peewee使用 peewee 更新动态确定的字段
【发布时间】:2014-03-17 16:01:01
【问题描述】:

我有一个类似以下的 peewee 模型:

class Parrot(Model):
    is_alive = BooleanField()
    bought = DateField()
    color = CharField()
    name = CharField()
    id = IntegerField()

我从用户那里获取这些数据并在(MySQL)数据库中查找相应的 id。我现在要做的是更新那些目前未设置/为空的属性。例如,如果新数据具有以下属性:

is_alive = True
bought = '1965-03-14'
color = None
name = 'norwegian'
id = 17

数据库中的数据有:

is_alive = False
bought = None
color = 'blue'
name = ''
id = 17

我想更新购买日期和名称(未设置或为空),但不更改 is_alive 状态。在这种情况下,我可以在不同的类实例中获取新旧数据,手动创建属性列表并一对一进行比较,在必要时进行更新,最后将结果保存到数据库中。但是,我觉得可能有更好的方法来处理这个问题,它也可以用于具有任何属性的任何类。有吗?

【问题讨论】:

    标签: python mysql peewee


    【解决方案1】:

    MySQL解决方案:

    UPDATE my_table SET  
        bought = ( case when bought is NULL OR bought = '' ) then ? end )
      , name   = ( case when name   is NULL OR name   = '' ) then ? end )
      -- include other field values if any, here
    WHERE
      id = ?
    

    使用您的脚本语言来设置参数值。
    如果参数匹配旧值,则默认不进行更新。

    【讨论】:

    • 谢谢。但是在这种情况下,我的示例中的 is_alive 参数不会被替换为新参数吗?
    • 除非您设置特定字段进行更新,否则它不会在表格中更改。
    • 所以我仍然需要先获取数据库条目以确定是否应该更新 is_alive?然后我可以像问题末尾提到的那样进行一般的 update ,并且不需要在 MySQL 级别选择任何字段...
    • 由于您已经拥有旧数据和数据实例,您可以检查is_alive 是否需要任何更新。如果是,请按照我的回答中的建议在 update 语句中设置相同的值。
    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多