P_S
P_S

Reputation: 345

Updating dynamically determined fields with peewee

I have a peewee model like the following:

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

I get this data from the user and look for the corresponding id in the (MySQL) database. What I want to do now is to update those attributes which are not set/empty at the moment. For example, if the new data has the following attributes:

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

and the data from the database has:

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

I would like to update the bought date and the name (which are not set or empty), but without changing the is_alive status. In this case, I could get the new and old data in separate class instances, manually create a list of attributes and compare them one for one, updating where necessary, and finally saving the result to the database. However, I feel there might be a better way for handling this, which could also be used for any class with any attributes. Is there?

Upvotes: 0

Views: 1217

Answers (1)

Ravinder Reddy
Ravinder Reddy

Reputation: 24002

MySQL Solution:

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 = ?

Use your scripting language to set the parameter values.
In case of the parameters matching the old values, then update will not be performed, by default.

Upvotes: 0

Related Questions