Sql: Aggiornamento o inserimento in una sola query

  
Quando si scrivono applicazioni che utilizzano un database per il salvataggio dei dati, è sempre importante tenere presente che la velocità è uno dei fattori più influenti per la buona riuscita del nostro lavoro. Bisogna infatti pensare che in ogni banca dati possono essere memorizzati milioni di record che, se analizzati e trattati, possono richiedere tempo e risorse che vengono sottratti ad altre attività che nello stesso momento girano sulla macchina in uso. Proprio per questo motivo quando si lavora su db sql è sempre preferibile demandare ogni tipo di attività al database stesso poiché la sua struttura ed i suoi strumenti sono programmati affinché le operazioni siano il meno dispendiose possibile.
Una delle attività più ricorrenti da effettuare su una serie di dati è il loro aggiornamento (se i dati sono presenti) o il loro inserimento (qualora essi non esistano ancora) all’interno del database in base ad una serie di variabili campione (ad esempio l’imput di un utente in una form). Questo lavoro richiede sicuramente un’estrazione di dati per effettuare un confronto ed un’analisi al fine di capire se eseguire un aggiornamento o un inserimento. Se volessimo analizzare le operazioni da eseguire con una serie di step, rappresentanti un algoritmo, essi si presenterebbero così:
APRO LA CONNESSIONE AL DB
CERCO I DATI NEL DB
SE I DATI SONO PRESENTI:
    AGGIORNA I DATI CON I NUOVI VALORI
ALTRIMENTI:
    INSERISCI I DATI NEL DB
CHIUDO LA CONNESSIONE AL DB
Come si può vedere, nonostante il codice sia il più minimale possibile, esso richiede una serie di passaggi che portano via una notevole quantità di tempo. Basti pensare che se il database in questione contiene 1 milione di record esso verrà (nella migliore delle ipotesi) “percorso” 2 volte (non necessariamente nella sua interezza) e ciò significa analizzare una grande mole di dati. Se a ciò aggiungiamo la complessità dei vari moduli dei diversi linguaggi di programmazione che dovrebbero aiutarci in questo lavoro allora capiamo quanto risparmiare secondi preziosi diventi fondamentale. 
A giungerci in aiuto in questo contesto arriva uno strumento sql davvero molto potente: ON DUPLICATE KEY. Esso ci permette di eseguire le operazioni appena viste sopra (aggiornamento o inserimento) in una sola query senza preoccuparci di estrazioni e confronti. Il suo funzionamento è molto semplice. Esso si prende in carico il compito di analizzare la presenza di una determinata chiave e nel caso essa sia presente aggiornarla altrimenti inserirla. La sintassi si presenta come segue (l’esempio è riferito ad un db MySql):
INSERT INTO tabella (chiave, campo1, campo2, …, campoN) VALUES (valchiave, val1, val2, …, valN) ON DUPLICATE KEY UPDATE campo1=val1, campo2=val2, …, campoN = valN
In pratica la query si occupa di cercare all’interno del db il record in base al valore della chiave primaria (nel nostro caso chiave) qualora esso sia presente verrà aggiornato con i valori della tupla che segue VALUES altrimenti verrà creata una nuova voce con i valori definiti dopo UPDATE. Si noti che nell’esempio che il valore di chiave nel caso di inserimento non è definito poiché il database conterrà una chiave con autoincremento ma qualora (per nostre scelte strutturali) la chiave deve essere definita manualmente la si potrà passare come un qualsiasi altro parametro. La query diventerebbe così:
INSERT INTO tabella (chiave, campo1, campo2, …, campoN) VALUES (valchiave, val1, val2, …, valN) ON DUPLICATE KEY UPDATE chiave=valchiave, campo1=val1, campo2=val2, …, campoN = valN
Grazie all’uso di ON DUPLICATE KEY i vecchi step dell’algoritmo diventano:
APRO LA CONNESSIONE AL DB

ESEGUO QUERY

CHIUDO LA CONNESSIONE AL DB
La scelta di questo strumento si è dimostrata appropriata in un test eseguito di persona. Si è visto, infatti, che confrontando i tempi di esecuzione di uno script python non ottimizzato con db mysql in locale popolato da 96000 record di prova, i due diversi algoritmi (con e senza ON DUPLICATE KEY) hanno portato una differenza di tempo di circa il 15%.
  

ReportLab e Python: Creare codici a barre

Come abbiamo avuto modo di vedere, mediante l’uso della libreria offerta da ReportLab, è possibile creare in maniera molto flessibile dei PDF che soddisfino tutti le nostre necessità. Ora però, una volta capito come creare un documento, abbiamo la necessità che esso venga riempito con qualcosa di utile. 
In ogni contesto lavorativo, e quindi a maggior ragione in un contesto industriale come quello oggetto d’esame nello scorso articolo, la praticità che l’informatica può offrire, è lo strumento migliore che aiuta l’utente a disfarsi di un grosso carico di lavoro ritenuto inutile. Dotare il proprio documento di un codice a barre può servire per effettuare numerose operazioni utili nel futuro come  ricerche, organizzazione di documenti, generazione di riferimenti rapidi da riportare su eventuali documenti cartacei, etc…

Ora vediamo come sfruttare ReportLab per creare un codice a barre da inserire nel nostro documento.
Il codice da esaminare è il seguente:

—– Python —–
#!/usr/bin/env python

from reportlab.pdfgen import canvas (1) 

from reportlab.lib.units import mm (2)
from reportlab.graphics.barcode import code39 (3)

mio_pdf = canvas.Canvas(‘mio.pdf’) (1)
# —– imposta le dimensioni

mio_pdf.setPageSize((204, 65)) (1)

# —– genera ed imposta il barcode
barcode = code39.Extended39(‘1234’, barWidth=0.5*mm,barHeight=8*mm) (4)
barcode.drawOn(mio_pdf, 10*mm, 10*mm) (5)

# —– genera e salva il pdf
mio_pdf.showPage() (1)
mio_pdf.save() (1)
———-
 
Anche questa volta, il sorgente da analizzare è molto semplice e racchiude solo lo stretto necessario affinché venga compreso l’uso dei codici a barre. 
Il codice che è già stato esplicato nel precedente articolo (1) non verrà ritrattato e pertanto vi invito ad una rilettura del precedente post per comprenderne il significato ed il comportamento.
Innanzitutto partiamo dall’inclusione di una nuova voce (2) che ci permette di convertire al volo tutte le unità di misura (che vengono richieste in pollici) in millimetri. In questo modo la generazione dei documenti ed il calcolo delle misure risulterà molto più semplice ed immediata. Successivamente (3) è presente la vera e propria importazione del modulo che si occupa di generare il nostro codice a barre. La funzione da utilizzare è Extended39. Essa riceve un parametro e restituisce il riferimento all’oggetto barcode. Il parametro da passare alla funzione è la stringa da trasformare in codice a barre. Nel nostro esempio si è scelto di convertire la stringa ‘1234’. Si tenga presente che la funzione accetta altri parametri opzionali e due di essi sono stati inseriti nell’esempio. barWidth e barHeight servono, infatti, ad impostare, rispettivamente, larghezza ed altezza dell’immagine che verrà generata. Si noti come per tale situazione si sia usata la variabile mm, precedentemente (1) importata. Come già detto, essa converte automaticamente i millimetri indicati in punti. Subito dopo aver generato il nostro oggetto barcode possiamo “disegnarlo” all’interno del pdf con il suo metodo drawOn. Esso accetta tre parametri: un oggetto di tipo canvas (quello che stiamo usando per generare il nostro pdf), nel quale inserire l’immagine, la posizione sull’asse orizzontale e quella sull’asse verticale nel nostro documento della stessa.
Come si può notare anche la generazione dei codici a barre è molto elastica e potente con questo strumento e nella documentazione ufficiale si possono trovare altri riferimenti ad altre funzioni certamente utili.

Disponibili i sorgenti dell’originale Prince of Persia

Come era stato preannunciato in un precedente post, una fortuita coincidenza aveva permesso a Jordan Mechner di riottenere i sorgenti dell’orginale Prince of Persia che risultavano perduti ormai da numerosi anni. Lo stesso sviluppatore, dopo il ritrovamento del proprio tesoro, aveva promesso che dopo un aggiornamento del codice avrebbe provveduto a caricarlo in modo da rendere il tutto idoneo ad un rilascio Open Source in grande stile. La notizia a fatto il giro del mondo e la gente era in attesa che quanto detto divenisse realtà.
Per tutti i nostalgici e per i curiosi finalmente la parola è stata promessa e grazie all’hosting offerto da GitHub ora è possibile esplorare, scaricare e, perchè no, forkare il progetto per far nascere qualcosa di nuovo o ridar vita a qualcosa di vecchio.

 
Sicuramente la notizia è tra le più interessanti dell’ultimo periodo e c’è la certezza che qualcuno e già all’opera o lo sarà a breve per portare questo piccolo capolavoro della storia dell’informatica sulle più recenti piattaforme in circolazione. Forse lo troveremo a breve su le nostre linux box o nei nostri mac oppure vedremo il principe eseguire i celebri salti in una finestra di Windows. Rimane comunque il fatto che la storia e storia e questo  codice ne è sicuramente un pezzo importante.