batchUpdate

La batchUpdate è una funzione messa a disposizione da Genropy per accorciare l’operazione di update di molti record risultato di una query: in questo modo, invece di ripetere l’operazione di modifica per ogni singolo record risultato della query, è possibile effettuare la modifica su tutti i record contemporaneamente.

Quindi, ad esempio, invece di applicare la modifica all’interno di un ciclo for:

prodotti = tbl_prodotto.query(where='$descrizione ILIKE :desc' , desc='Tavolo%', for_update = True).fetch()

for p in prodotti:
  old_rec = dict(p)
  p['prezzo_unitario'] = 49
  tbl_prodotto.update(p, old_rec)

È possibile sfruttare la batchUpdate:

tbl_prodotto.batchUpdate( dict(prezzo_unitario = 49),
                       where='$descrizione ILIKE :desc',
                       desc='Tavolo%')

In questo caso stiamo passando al metodo un updater «statico» sotto forma di dizionario contenente il nuovo campo, mentre in casi più complessi è possibile passare alla batchUpdate un updater «dinamico» sotto forma di metodo callback definito precedentemente:

def myupdater(rec):

  if rec['prezzo_unitario'] < 100:
      rec['prezzo_unitario'] = rec['prezzo_unitario'] + 11
  else:
      rec['prezzo_unitario'] = rec['prezzo_unitario'] - 5

updated_pkeys = tbl_prodotto.batchUpdate(myupdater,
                                       where='$descrizione ILIKE :desc',
                                       desc='Tavolo%')

mydb.commit()

Come in una qualsiasi Operazione di lettura la batchUpdate può ricevere, alternativamente alla condizione where, una lista di pkeys, così come possono essere richieste delle colonne specifiche necessarie poi all’interno del metodo updater:

updated_pkeys = tbl_prodotto.batchUpdate(myupdater,
                                       where='$descrizione ILIKE :desc',
                                       columns='*,@classe_iva.aliquota,
                                       desc='Tavolo%')

Suggerimento

Arricchendo la batchUpdate con l’attributo ignoreMissing=True, evitiamo di mandare il sistema in errore in caso mancassero record da aggiornare, mentre con _raw_update=True verrà effettuato l’update ignorando eventuali Trigger

Al termine dell’operazione ritornerà comunque sempre le pkeys dei record modificati.


Parametri:

Nome parametro

Tipo

Descrizione

for_update

B

Eseguendo una qualsiasi operazione di lettura con questo parametro verrà restituito come risultato un record pronto per la modifica

where

T

La where per l’individuazione del record

pkeys

T

La lista delle pkeys dei record da modificare

_raw_update

B

È possibile utilizzare il parametro _raw_update=True per evitare di innescare dei trigger durante l’operazione di update

cb

T

La batchUpdate può ricevere un metodo di callback o un dizionario con le operazioni di modifica da effettuare

Autore della sezione: Davide Paci