Topic: Sviluppo funzione di comparazione valori a database sqlite3  (Letto 667 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline bambam

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Buongiorno e buon anno a tutti, l'obiettivo della funzione che dovrei sviluppare dovrebbe essere questa:

inserisco valore in una 'entry' e al click del bottone dedicato invece di inserire a priori il valore a database eseguire una condizione che verifichi che il valore indicato non sia già presente nel database prima di inserirlo, lanciando
una messagebox.showerror(tkinter) e bloccare l'inserimento in caso il valore sia già presente.
Ad ora la funzione inserisce senza  condizioni ed è questa:

def addsnakedata():
         if(len (snakeID.get())!=0) :
              snakedb_backend.addsnakerec(snakeID.get() , snakeSpecies.get() , snakeAge.get() , snakeGender.get() ,snakeWeight.get())
              SnakeList.delete(0,END)
              SnakeList.insert(END,snakeID.get() , snakeSpecies.get() , snakeAge.get() , snakeGender.get() ,snakeWeight.get())


Questa funzione richiama lo script di background a ''addsnakerec'' che è questa:


def addsnakerec(snakeID , snakeSpecies , snakeAge , snakeGender ,snakeWeight):
    con =sqlite3.connect("snake.db")
    cur = con.cursor()
    cur.execute("INSERT INTO snake VALUES (NULL,? ,? ,? ,? ,?)",(snakeID, snakeSpecies, snakeAge, snakeGender,snakeWeight))


Il valore da comparare è ''snakeID''.
Grazie a chi riuscirà ad aiutarmi.. buon anno dinnuovo :party: :party: :party:

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 352
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #1 il: Gennaio 01, 2020, 20:18 »
Potrei dirti, sbrigativamente, che Ti basterebbe eseguire una query di ricerca tipo "SELECT * FROM snake WHERE snakeID = 'id_da_inserire'" e se restituisce dati annullare il processo ... ma, invece, Ti faccio un esempio :

Supponiamo di creare una tavola snake "leggermente" diversa da quella indicata in Tuo precedente post

>>> def snakedata():
conn = sqlite3.connect('snake.db')
cur = conn.cursor()
query = '''
CREATE TABLE IF NOT EXISTS snake (id INTEGER PRIMARY KEY,
                                  snakeID TEXT UNIQUE NOT NULL,
                                  snakeSpecies text,
                                  snakeAge text,
                                  snakeGender text,
                                  snakeWeight text)
'''
cur.execute(query)
conn.commit()
conn.close()


>>> snakedata()


Ora, popoliamola un po'
>>> data = [(1, "crota", "Crotalo", "20", "Serpente a sonagli", "5"),
    (2, "viper", "Vipera", "18", "Vipera comune", "1.5"),
    (3, "boa", "Boa", "21", "Boa constrictor", "17")
    ]
>>> conn = sqlite3.connect('snake.db')
>>> query = 'INSERT INTO snake VALUES (?, ?, ?, ?, ?, ?)'
>>> conn.executemany(query, data)
<sqlite3.Cursor object at 0x7ff87f187a40>
>>> conn.commit()


Diciamo, ora, che abbiamo acquisito uno splendido anaconda nel nostro rettilario, vogliamo inserirlo
>>> serpe = (4, "anac", "Anaconda", "22", "Anaconda", "82")
>>> conn.execute(query, serpe)
<sqlite3.Cursor object at 0x7ff87f187b90>
>>> conn.commit()
>>> result = conn.execute('SELECT * FROM snake')
>>> for biscia in result:
print(biscia)


(1, 'crota', 'Crotalo', '20', 'Serpente a sonagli', '5')
(2, 'viper', 'Vipera', '18', 'Vipera comune', '1.5')
(3, 'boa', 'Boa', '21', 'Boa constrictor', '17')
(4, 'anac', 'Anaconda', '22', 'Anaconda', '82')

Allora ... abbiamo felicemente inserito il nostro anaconda nel rettilario e visto che striscia tra i suoi simi .... però i facenderos brasiliani hanno salvato un anaconda verde dalla foresta che avevano incendiato ed hanno pensato bene, non sapendo che farsene, di mandarlo a tener compagnia a quello in nostro possesso, lo inseriamo:

>>> serpe = (5, "anac", "Anaconda", "19", "Anaconda verde", "65")
>>> conn.execute(query, serpe)
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    conn.execute(query, serpe)
sqlite3.IntegrityError: UNIQUE constraint failed: snake.snakeID
>>>

... Non ce lo ha inserito, malgrado fosse un anaconda! ...ciò per questa particolare istruzione data per creare la tavola :  snakeID TEXT UNIQUE NOT NULL,
detta istruzione definisce che uno "snakeID" deve essere unico valore nella tavola "snake£ e deve essere, per forza, valorizzato in ogni inserimento.

Ovviamente, in un programma, tale violazione della integrità dati deve essere intercetta, proseguendo nell'esempio :
>>> try:
conn.execute(query, serpe)
except sqlite3.IntegrityError as e:
print('Errore di inserimento :', e)
conn.rollback()


Errore di inserimento : UNIQUE constraint failed: snake.snakeID
>>> serpe = (5, "anacv", "Anaconda", "19", "Anaconda verde", "65")
>>> try:
conn.execute(query, serpe)
except sqlite3.IntegrityError as e:
print('Errore di inserimento :', e)
conn.rollback()


<sqlite3.Cursor object at 0x7ff87f187c70>
>>> result = conn.execute('SELECT * FROM snake')
>>> for biscia in result:
print(biscia)


(1, 'crota', 'Crotalo', '20', 'Serpente a sonagli', '5')
(2, 'viper', 'Vipera', '18', 'Vipera comune', '1.5')
(3, 'boa', 'Boa', '21', 'Boa constrictor', '17')
(4, 'anac', 'Anaconda', '22', 'Anaconda', '82')
(5, 'anacv', 'Anaconda', '19', 'Anaconda verde', '65')
>>>

... in un colpo solo Ti mostrato come intercettare tale "Violazione" ed il possibile "rimedio" (cambiare lo snakeID) ... Tutta 'sta tirata per renderTi evidente una cosa significativa : non è sufficiente solo apprendere un linguaggio di programmazione ma è bene apprendere anche altre cose, nello specifico se intendi adoperare database relazionali, guardati il loro funzionamento ed il loro linguaggio di definizione/interrogazione.

Se farlo o meno à una Tua scelta, anche se te lo consiglio vivamente, dato l'ordine delle Tue richieste.

Detto questo, ti suggerirei di modificare la tavola come Ti ho mostrato, poi di variare la funzione addsnakedata() in questo modo :
def addsnakedata():
if(len (snakeID.get())!=0) :
try:
snakedb_backend.addsnakerec(snakeID.get(),
                                  snakeSpecies.get(),
                                  snakeAge.get(),
                                  snakeGender.get(),
                                  snakeWeight.get()
                                  )
      SnakeList.delete(0,END)
        SnakeList.insert(END,
                       snakeID.get(),
                       snakeSpecies.get(),
                       snakeAge.get(),
                       snakeGender.get(),
                       snakeWeight.get()
                       )
except sqlite3.IntegrityError as e:
# qui intercetti l'errore ed annulli l'operazione


C'è da dire, che l'intercettazione andrebbe effettuata in "addsnakerec", per eseguire il rollback ... ma lascio a Te le decisioni "operative" che vorrai applicare, nel caso di occorra, vedi la docs di Raise ;)

Offline bambam

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #2 il: Gennaio 04, 2020, 11:49 »
ho riscritto la funzione nella front end , senza inserire il comando rollback, lo scrpit esegue correttamente , all  inserimento dell id gia esistente crea messaggio di errore e non inserisce, volevo però chiedere, senza eseguire il comando rollback si va incontro a qualche problema particolare di cui non sono a conoscenza? perche cosi su 2 piedi sembra girare come vorrei ...
volevo chiedere per un errore strano che mi si presenta senza apparenti conseguenze durante l utilizzo delo script:
IndexError: tuple index out of range
e mi si presente quando clicco ripetutamente in una delle entry di inserimento dati ...
se clicco una sola volta non da nessun tipo di errore se clicco all impazzata si ... come posso fissare questo problema e perche mi si presente ?
ps: l errore non ha alcuna interazione con l eseguibilità apparente dello scrpit e si manifesta sia che le entry siano vuote sia che siano piene...
e si verifica solo quando prima di cliccare sulla entry seleziono una voce dalla lista degli esemplari inseriti...
mentre se seleziono nella lista una riga in cui ancora non vi è inserito nulla da un altro errore e quindi mi sorge spontanea la domanda: sono tutti errori da fissare tramite eccezioni ?
« Ultima modifica: Gennaio 04, 2020, 12:15 da bambam »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 352
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #3 il: Gennaio 04, 2020, 12:21 »
Dipende un po' dalla base dati e da come è impostata ... in sostanza se c'è l'autocommit (scrittura immediata dei dati) o meno e altro.

Il rollback serve per annullare una "transazione" andata male e ripristinare ad un iniziale punto precedente la base dati, la "transazione" non riguarda necessariamente una singola operazione sulla base dati ma può riguardare tutta una serie di operazioni (anche molto grossa) riguardante anche dati presenti su più tavole contemporaneamente. Di norma si stabilisce un punto di partenza tramite un "begin-trans".

Personalmente, ho l'abitudine di disattivare l'autocommit e racchiudere tutte le operazioni di inserimento e modifica dei dati in blocchi "begintrans/commit-o-rollback"., anche quando faccio piccole cose.

Per maggiori dettagli sulla "faccenda leggi qua

Per il "tuple index out of range" evidentemente c'è una situazione in cui vai a leggere qualcosa che non c'è, vai ad indovinare come fai ;)

Comunque, si, prevedere i possibili errori e prevenirli/intercettarli è un obbligo per qualsiasi applicazione non sia un "giocattolo", ed anche per quest'ultime non farlo è una pessima abitudine.

Ciao
« Ultima modifica: Gennaio 04, 2020, 12:27 da nuzzopippo »

Offline bambam

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #4 il: Gennaio 04, 2020, 12:39 »
grazie mille , adesso proverò a capire il perchè di quei 2 errori , per il rollback ogni funzione ha l inizializzazione a db e chiusura di conseguenza in questo caso specifico non viene scritto nulla a db in caso di sollevamento ecccezione.
uno dei 2 errori penso sia dovuto al fatto che non vi è un eccezione per la selezione nulla dalla lista , la prima ( index out of range) invece devo studiarmela un po riguardando la parte di codice dedicata

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 352
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #5 il: Gennaio 04, 2020, 14:48 »
...uno dei 2 errori penso sia dovuto al fatto che non vi è un eccezione per la selezione nulla dalla lista,,,

Per quanto riguarda questo aspetto, non occorre una eccezione, è sufficiente verificare che la selezione corrente nella lista abbia o meno dei dati, qualcosa tipo :
var = lista.currselection() # restituisce una lista degli item selezionati
if not var:                                                       # se non è stato restituito niente esce
return

Offline bambam

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #6 il: Gennaio 04, 2020, 21:08 »
questa è la funzione incriminata:

def snakerec(event):
         global sd
         searchsnake = SnakeList.curselection()[0]
         sd = SnakeList.get(searchsnake)
       
         
         self.txtSnakeID.delete(0,END)
         self.txtSnakeID.insert(END,sd[1])
         self.txtSnakeSpecies.delete(0,END)
         self.txtSnakeSpecies.insert(END,sd[2])
         self.txtSnakeAge.delete(0,END)
         self.txtSnakeAge.insert(END,sd[3])
         self.txtSnakeGender.delete(0,END)
         self.txtSnakeGender.insert(END,sd[4])
         self.txtSnakeWeight.delete(0,END)
         self.txtSnakeWeight.insert(END,sd[5])


entrambi gli errori vengono attribuiti a questa funzione

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 352
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #7 il: Gennaio 05, 2020, 06:00 »
Questa funzione, a mio parere, evidenzia numerose criticità :
  • Stai mischiando programmazione funzionale con programmazione ad oggetti, se non calibrata bene la faccenda può causare notevoli problemi;
  • Utilizzi dinamicamente una variabile globale, idea pessima, ancora gestibile se è riferimento per un unico "oggetto", inteso anche come finestra dati, diventa ingestibile appena gli oggetti che vi riferiscono e manipolano aumentano;
  • il modo di utilizzo di SnakeList sembra dimostrare che il suo scope è globale ... ma domando, non fa parte di una GUI? e questa HUI non è definita in una classe? Dove è il suo "self."?

Comprendo i problemi dovuti all'approccio iniziale, li ho avuti e in parte li ho ancora, anche io, pur se "il grosso" lo ho affrontato con altri linguaggi, ma i Tuoi problemi derivano direttamente da carenze concettuali, principalmente in ambito di programmazione ad oggetti,l' apparente stato attuale sembra fatto apposta per crearti dolore.

il metodo "curselection()" delle liste restituisce gli items selezionati, ammesso che vi sia una selezione, un primo controllo da fare è vedere se restituisce qualcosa.

Pur lasciando le criticità su esposte, Ti suggerisco un tentativo di "mettere una pezza", condito da un suggerimento di metodi di classe per svuotare e compilare i controlli, fermo restando quanto detto prima sulle criticità che credo di vedere.

def snakerec(event):            # <-- MALE : snakerec(self, event)
global sd # <-- MALE : GLOBAL == problemi
if SnakeList.curselection():
searksnake = SnakeList.curselection()[0]
sd = SnakeList.get(searchsnake)
else:
return

if sd:
self._compile_ctrl(sd)

# Ti troverai certo più volte a svuotare i controlli, un
# metodo di classe che se ne occupa è più conciso
def _clear_ctrl(self):
self.txtSnakeID.delete(0,END)
    self.txtSnakeSpecies.delete(0,END)
self.txtSnakeAge.delete(0,END)
self.txtSnakeGender.delete(0,END)
self.txtSnakeWeight.delete(0,END)
       
       
# stessa cosa, un unico metodo di classe che riceve i dati da
# mostrare e li rappresenta
def _compile_ctrl(self, sd):
# svuota
self._clear_ctrl()
# e riempie
    self.txtSnakeID.insert(END,sd[1])
    self.txtSnakeSpecies.insert(END,sd[2])
self.txtSnakeAge.insert(END,sd[3])
self.txtSnakeGender.insert(END,sd[4])
self.txtSnakeWeight.insert(END,sd[5])


NON copiare acriticamente ciò che Ti propongo, io non ho presente la Tua applicazione in sviluppo, cerca di comprendere l'idea alla base ed il perché delle modifiche proposte (oltre che del MALE indicato).

Ciao :)

Offline bambam

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #8 il: Gennaio 05, 2020, 08:58 »
Buon giorno , la funziona clear per pulire la entry dopo una selezione tramite snakelist é gia inserita nello script , la funzione snakerec ( che si trova nell interfaccia ) interagisce unicamente con la suddetta lista, per come e progettato lo script ed essendo alle prime armi ho pensato di evitare problematiche derivate dalla comunicazione ed intreccio di db, vi sono 3 db ed ognuno di essi ha le proprie funzioni... Non nascondo che l istruziome globale é qualcosa che non ho approfondito difatti non sono a conoscenza delle criticita che si possano presentare ... Si tratta di problemi legati all aumentare dei dati nel db su cui lavora o legati al possibile intreccio di dati con altri db?

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 352
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #9 il: Gennaio 05, 2020, 10:35 »
Buon giorno , la funziona clear per pulire la entry dopo una selezione tramite snakelist é gia inserita nello script ...
Verrebbe da chiedere "perché non l'hai utilizzata" na comprendo che Tu abbia voluto chiarire l'esempio.

... ho pensato di evitare problematiche derivate dalla comunicazione ed intreccio di db, vi sono 3 db ed ognuno di essi ha le proprie funzioni...
Oiboh! così rinunci alle possibilità offerte dai database relazionali ... a 'sto punto, non dico che equivarrebbe ad utilizzare json o file csv ma poco ci manca ... la potenza dei database relazionali è data, in larga parte, dalle relazioni che possono essere definite tra le varie "tavole" dati, dato che sei alle prime armi, se non hai scadenze, parti bene, con calma e senza fretta di "fare", leggiti qualcosa sui db, cerca di capire come funzionano, come strutturarli ed interrogarli, vedrai che Ti sarà utile poi.

Non nascondo che l istruziome globale é qualcosa che non ho approfondito difatti non sono a conoscenza delle criticita che si possano presentare ...
È una questione legata al design progettuale delle applicazioni, complica notevolmente la vita ... anche se espresse per il C, le considerazioni contenute in questa pagina valgono tranquillamente per qualsiasi linguaggio, cerca in rete e fatti un'idea, qualche battuta in merito si è anche data proprio pochi giorni fa in un altro post.


Si tratta di problemi legati all aumentare dei dati nel db su cui lavora o legati al possibile intreccio di dati con altri db?
Cosa? l'index delle tuple in out-for-range prima indicato? Per niente, è design della applicazione : il controllo preventivo che Ti ho indicato dovrebbe eliminarlo, fermo restando la struttura di funzione da Te indicata.
Poi, tutto è possibile ... i misteri di una applicazione che usa TRE db per un obiettivo sconosciuto sono al di la della mia capacità divinatoria ;)

Offline bambam

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #10 il: Gennaio 05, 2020, 12:54 »
Per i problemi legati all istruzione global chiedevo se erano dovuti alla mole di dati o all intreccio do dati nelle tavole , e quale sarebbe eventualmente la metodologia da utilizzare al suo posto , si scadenze non ne ho quindi considerando che effettivamente con l inserimebto della comunicazione tra tavole renderebbe il tutto piu scorrevole e intuitivo per chi al di fuori di me potrebbe utilizzare questa applicazione ascoltero il consiglio e sviluppero il restante codice con questi presupposti modificando dove necessario il codice gia scritto .... Questa é solo uno script di un progetto molto piu grande e impegnativo , diciamo che é solo la parte dedicata alla registrazione dei dati gestionali ... Che si sviluppa su 3 database 2 per l inserimento dei dati relativi agli esemplari presenti in allevamebto suddivisi in 2 tavole in base alla specie ed un altro comune dedicato all inserimebto tramite id dei dati riguardanti il mantenimento degli stessi esemplari... Lo sviluppo di questa singola parte non comporta obbligatoriamente la comunicazione tra database ma se ci fosse come detto prima sarebbe certamente meglio ... Detto questo la funzione di comparazione id dovrei modificarla per evitare che nell altro database vengano inseriti gli stessi id " quindi non piu evitare di inserire l id gia esistente nella tabella ma in entrambe...
« Ultima modifica: Gennaio 05, 2020, 20:03 da bambam »

Offline bambam

  • python unicellularis
  • *
  • Post: 31
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #11 il: Gennaio 06, 2020, 21:24 »
Sto ancora cercando di ricreare la funzione con istruzione condizionale per il controllo dell id senza successo ...:
Ho scritto la funzione in background:

Def ctrl (snakeID="") :
Con= sqlite3.connect ("spider.db")
Cur= con.cursor()
Cur.execute("SELECT spiderID FROM spider WHERE spiderID=?",(snakeID,))
rows= cur.fetchall()
Con.close
RETURN rows

 questa funzione deve essere richiamata dalla funzione seguente:

def addsnakedata():
         if(len (snakeID.get())!=0) :
Try:
              snakedb_backend.addsnakerec(snakeID.get() , snakeSpecies.get() , snakeAge.get() , snakeGender.get() ,snakeWeight.get())
              SnakeList.delete(0,END)
              SnakeList.insert(END,snakeID.get() , snakeSpecies.get() , snakeAge.get() , snakeGender.get() ,snakeWeight.get())
Except sqlite.integrityerror as è:
                Finestra errore()

Questa é la funzione richiamata per l inserimento

def addsnakerec(snakeID , snakeSpecies , snakeAge , snakeGender ,snakeWeight):
    con =sqlite3.connect("snake.db")
    cur = con.cursor()
    cur.execute("INSERT INTO snake VALUES (NULL,? ,? ,? ,? ,?)",(snakeID, snakeSpecies, snakeAge, snakeGender,snakeWeight))

 non riesco a capire come integrare la condizionale , ho provato con un ciclo :
[/pythoncode]
For row in snake_backend.ctrl(snakeID.get()):
   If row !=0:
      Finestra errore ()
   Else :
          Try:
                 (Resto della funzione)[/pythoncode]
Ma non funziona
« Ultima modifica: Gennaio 06, 2020, 21:37 da bambam »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 352
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #12 il: Gennaio 06, 2020, 21:46 »
Supposto che snakeID sia una Entry o una StringVar, e fermo restando la funzione ctrl esposta, prova così


def addsnakedata():
if(len (snakeID.get())!=0) :
Try:
if ctrl(str(snakeID.get())) : return
snakedb_backend.addsnakerec(snakeID.get(),
snakeSpecies.get(),
snakeAge.get() ,
snakeGender.get(),
snakeWeight.get()
)
SnakeList.delete(0,END) # <= da qui non capisco bene
SnakeList.insert(END,snakeID.get(),
snakeSpecies.get(),
snakeAge.get(),
snakeGender.get(),
snakeWeight.get()
) # <= sin qui, ma Ok
Except sqlite.integrityerror as è:
Finestra errore()


Ma, tieni presente, che programmare non è tirare ad indovinare o tentare : analizza il flusso del programma che stai implementando e, dove hai incertezze, fermati. documentati su dubbi e problemi ed approfondisci.
« Ultima modifica: Gennaio 06, 2020, 21:48 da nuzzopippo »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 352
  • Punti reputazione: 0
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #13 il: Gennaio 07, 2020, 14:02 »
Sto ancora cercando di ricreare la funzione con istruzione condizionale per il controllo dell id senza successo ...:
Ho scritto la funzione in background:

....
Con.close
RETURN rows

...
Ma non funziona

Ieri sera stavo già dormendo quando ho risposto : "RETURN"? Hai scritto proprio così nel codice? Se si, con cosa lo stai editando?, di certo NON può essere eseguito, scritto come riportato, le indentazioni sono "sballate".

Per altro, Ti ho indicato di uscire senza far niente con la variazione in "addsnakedata", certamente potresti anche emettere una finestra di avviso e poi uscire, l'essenziale è non eseguire nessuna operazione in presenza di snakeID già registrati e permettere la correzione del dato.

Comunque, credo che Ti sarebbe utile dare una scorsa alla intercettazione degli errori in python.

Ciao
« Ultima modifica: Gennaio 07, 2020, 14:04 da nuzzopippo »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.151
  • Punti reputazione: 9
    • Mostra profilo
Re:Sviluppo funzione di comparazione valori a database sqlite3
« Risposta #14 il: Gennaio 07, 2020, 16:18 »
A costo di sembrare un bot, qui tocca attaccarci il solito disclaimer standard:

Non è ancora stata trovata una scorciatoia per programmare eliminando la necessità di imparare a programmare. E non è ancora stato trovato un modo per imparare a programmare scrivendo codice alla come-viene-viene puntando a risolvere un problema specifico. Il consiglio è sempre di procurarsi un buon libro (e il Lutz è sempre la scommessa sicura) e seguirlo passo-passo dedicandoci tempo e concentrazione.

Ora, anche se un gestionale con le classiche operazioni CRUD è una delle tipologie di software più tipiche, perfino noiose da implementare, resta però un tipo di architettura complesso, che richiede una conoscenza non superficiale di molti differenti concetti, e l'uso di parecchie tecniche di programmazione. Non è una di quelle cose che basta girare su internet a "prendere spunto".
Per dire, solo questo thread è già lungo 13 post (14 con questo), e mi sembra che stia cercando di avvicinarsi vagamente al concetto di ORM. Ora, uno potrebbe decidere di affidarsi a un ORM (boh, Sqlalchemy per dire) oppure potrebbe anche decidere di scriversi un simil-ORM "ad-hoc" fatto in casa... o anche prendere un'altra strada diversa... ma sia come sia, non si può non porsi il problema della relazione che esiste, in questi scenari, tra un oggetto Python e una riga in una tabella (o in più tabelle con join) di un database. E per questo, come si modella in questi scenari un oggetto Python e come lo si fa corrispondere a qualcosa che fisicamente poi sta dentro un database. E per questo serve sapere come funzionano le classi in Python, e come funzionano i database.
E tutto questo, naturalmente, è solo uno dei molti aspetti (il Model, per dirla in gergo) che bisogna pianificare in un tipico relazionale di questo tipo. Poi ovviamente ce ne sono un bel po' di altri.
Ora, l'OP mi perdoni la franchezza ma... è senz'altro possibile che continuando ad agitare un secchio di bulloni abbastanza a lungo, ne venga fuori un aereoplano... non tratterrei il respiro nell'attesa, però.