pythonpeewee

How can I Case-update based on a multi-index update statement?


Supposing I have a model class:

class A(Model):
    key1 = ...
    key2 = ...
    value1 = ...

I'd like to:

import pandas as pd

df = pd.DataFrame(data=..., index=['key1', 'key2'], columns=['value1'])
Model.update(value1=Case((A.key1, A.key2)), list(df.items()).where(...).execute()

but this doesn't work because Case seems to accept only a single key, at least I couldn't find such detail in the documentation.

I need to lookup the error I am getting.


Solution

  • At the original poster's request, here is how you would do it with row tuples:

    from peewee import *
    
    db = SqliteDatabase(':memory:')
    
    class Number(db.Model):
        v1 = IntegerField()
        v2 = IntegerField()
        label = TextField(default='')
    
    Number.create_table()
    
    for i in range(1, 5):
        Number.create(v1=i, v2=i)
    
    label_expr = Case(Tuple(Number.v1, Number.v2), (
        (Tuple(1, 1), 'one'),
        (Tuple(2, 2), 'two'),
        (Tuple(3, 3), 'three')), 'a lot')
    Number.update(label=label_expr).execute()
    
    for n in Number:
        print(n.v1, n.v2, n.label)