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