Forum >> Programmazione Python >> Database >> Problema con la ricerca in database da variabile

Pagina: 1

Buongiorno, il problema che sto trovando in questo momento è il seguente (sono su Windows, Python 3.8, Sqlite3) :




c.execute('SELECT * FROM Marche where Marca = "Ferrari"')




cosi facendo la ricerca nel db funziona regolarmente; il problrma arriva se io sostituito il dato di ricerca "Ferrari" con un variabile (x es.) G alla quale ho precedentemente associato il cantenuto "Ferrari".

Il messaggio che mi da è:




sqlite3.OperationalError: no such column: G




In effetti G non è la colonna ma il dato che deve cercare nella colonna Marca.




Dove sbaglio ? Non riesco a capire.




Grazie

------
Alberto
Puoi indicarmi quale parte della documentazione di sqlite non ti è chiara? https://docs.python.org/3/library/sqlite3.html
Puoi indicarmi quale parte della documentazione di sqlite non ti è chiara? https://docs.python.org/3/library/sqlite3.html

Buongiorno, non è una parte della documentazione che non mi è chiara, è che non mi funziona ..




# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print(c.fetchone())



Questo è l'esempio che mi da la documentazione ufficiale (quella che mi ha linkato tu), questo
è quello che ho ho fatto io :

		conn = sqlite3.connect('Assistenze_1.db') 
		c = conn.cursor()
#		c.execute("SELECT * FROM Marche WHERE Marca = 'Oppo'")

		marcadacercare = ("Motorola",)
		ric=c.execute("SELECT * FROM Marche WHERE Marca = ?",marcadacercare)

#		c.execute(ric , (marcadacercare,))
		print (c.fetchone())
#		for row in c.fetchone():
		a1 ,a2 , a3 , a4 , a5 , a6 , a7 , a8 ,a9 , a10 , a11 , a12 , a13 , a14 ,a15 , a16, a17 , a18 , a19 , a20 , a21 , a22 , a23 , a24 , a25 , a26 , a27, a28 , a29 , a30 , a31 , a32 , a33 , a34 , a35 , a36 , a37 , a38 = c.fetchone()
#			print (row)
#		print(row2)
#		print(marca)
		print(a1)
		print(a2)
		print(a3)
		print(a4)
		print(a5)
		Button_1.configure (text = a1)
		LABEL_LOGIN.insert(0, a4)
		LABEL_PWD.insert(0, a5)
		CODICE CLIENTE 1.configure(text = a2)
		ID PARTNER 1.configure(text = a3)
		LABEL_CALL_CENTER.configure(text = a  8)
		LABEL_CALL_CENTER_FUORI.configure(text = a9)
		LABEL_CALL_CENTER_MAIL.configure(text = a10)
		LABEL_CALL_CENTER_NOI_TEL_DATI.configure(text = a11)
		LABEL_CALL_CENTER_PIN_DATI.configure(text = a12)
		LABEL_CALL_CENTER_NOI_MAIL.insert(0, a13)
		LABORATORIO_DATI.configure(text = a14)
		CORRIERE_DATI.configure(text = a15)
		LABORATORIO_TEL_DATI.configure(text = a16)
		LABORATORIO_MAIL_DATI.configure(text = a17)
#
		PROCEDURE BUTTON 1.configure(text = a1  8)
		PROCEDURE_BUTTON_1_ALLEGATO = a19
		PROCEDURE BUTTON 2.configure(text = a20)
		PROCEDURE_BUTTON_2_ALLEGATO = a21
#
		NOTE BUTTON 1.configure(text = a22)
		NOTE_BUTTON_1_ALLEGATO = a23
		NOTE BUTTON 2.configure(text = a24)
		NOTE_BUTTON_2_ALLEGATO = a25
#
		MODULI BUTTON 1.configure(text = a26)
		MODULI_BUTTON_1_ALLEGATO = a27
		MODULI BUTTON 2.configure(text = a2  8)
		MODULI_BUTTON_2_ALLEGATO = a29
#
		LINK BUTTON 1.configure(text = a30)
		LINK_BUTTON_1_ALLEGATO = a31
		LINK BUTTON 2.configure(text = a32)
		LINK_BUTTON_2_ALLEGATO = a33
#
		LABEL_MAIL.insert(0, a34)
#
		LABEL SETTORE 1.configure(text = a35)
#
		AGGIORNATO_LABEL.configure(text = a3  8)

Se io utilizzo il parte di codice per la ricerca colorato di verde , funziona tutto regolare;
se io invece utilizzo la parte di codice colorato di viola ho il seguente errore :

('Motorola', None, None, '***', '**', 'https://stwebmanager.taly.it/', 'https://hda.taly.it/seade/setrade_amz_ric.aspx', '800-999.921', None, None, '079-90.69.727', '--', 'helpdesk@taly.it', 'Service (Pd)', 'SDA', '049-90.69.727', 'preventivi@taly.it', 'Procedura', 'C:/Procedure/Shell Cgm Python/Assistenze/Motorola/Procedura_portale.pdf', None, None, None, None, None, None, 'Modulo Richiesta', 'C:/Procedure/Shell Cgm Python/Assistenze/Motorola/Modulo compilazione del Cliente.pdf', None, None, None, None, None, None, 'servizioclienti@**.it', 'Tel', None, None, '2020-01-14')
Traceback (most recent call last):
File "Assistenze_db.py", line 583, in <module>
a.tariffe_gestori(scelta) # marca
File "Assistenze_db.py", line 204, in tariffe_gestori
a1 ,a2 , a3 , a4 , a5 , a6 , a7 , a8 ,a9 , a10 , a11 , a12 , a13 , a14 ,a15 , a16, a17 , a18 , a19 , a20 , a21 , a22 , a23 , a24 , a25 , a26 , a27, a28 , a29 , a30 , a31 , a32 , a33 , a34 , a35 , a36 , a37 , a38 = c.fetchone()
TypeError: cannot unpack non-iterable NoneType object

Non capisco perchè !!
Il db io con la parte verde lo leggo corretto e lo visualizzo in una interfaccia tkinter in maniera corretta.
Vorrei utilizzare le righe in viola perchè la marca la selezione con una list box .... ma non va !!!

Grazie



--- Ultima modifica di trescon in data 2021-01-24 17:28:35 ---

--- Ultima modifica di trescon in data 2021-01-24 17:30:02 ---
------
Alberto
mah sai, quel codice è talmente pieno di righe commentate, parti colorate, faccio-così-ma-forse-poi-così... che non si capisce proprio che percorso il tuo codice fa quando ottieni l'errore. Leggere la documentazione *a fondo* (non uno sguardo diagonale in tredici secondi netti alla ricerca di quello che ti serve sul momento... no, intendo proprio *a fondo*...) e imparare i pattern "naturali" per usare sqlite aiuta senz'altro.


Per quanto posso dirti a colpo d'occhio:

- c.execute("SELECT * FROM Marche WHERE Marca = ?", marcadacercare) è in effetti il pattern corretto (con "marcadacercare" una tupla, anche di un solo elemento). E' inutile assegnare questa espressione a una variabile "ric" di cui non ti farai niente, peraltro...

- c.fetchone() restituisce una sola riga... e la restituisce come una singola tupla di elementi, NON come una lista di tuple... quindi fare "for row in c.fetchone()" non fa quello che tu credi che faccia... non stai iterando sulle RIGHE restituite, ma sugli ELEMENTI dell'unica riga che ti viene restituita;


- una volta che la riga è restituita, guarda che è *consumata*... non ritorna più in quel cursore. Quindi fare "print(c.fetchone())" una prima volta per curiosare un po', e poi di nuovo "c.fetchone()" per iniziare a lavorare, non va bene. Il secondo fetchone() restituisce una riga diversa... e certo, se inoltre per puro caso il tuo database contenesse *una sola riga* con "Motorola"... ops, alla seconda saresti già panato perché la seconda riga... non esiste.





Ora, come ripeto, tutto questo è molto semplice da vedere, dopo aver letto *a fondo* la documentazione di sqlite3. Ma in generale, quando hai problemi sull'api di qualcosa che usi, prova sempre a scrivere l'esempio minimo che innesca il problema, lasciando fuori tutti gli orpelli non necessari (le label, tkinter... ma che c'entra col tuo problema col database?). Se ti sforzi di fare questo, invece di ricopiare tutto sul forum, vedrai che nove su dieci il problema ti diventa chiarissimo, e lo capisci in un secondo.






Pagina: 1



Esegui il login per scrivere una risposta.