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
