Forum
>>
Programmazione Python
>>
Database
>>
pymysql.err.ProgrammingError: (1064...
Pagina: Indietro 1 2
Esegui il login per scrivere una risposta.
Scritto da RicPol |
2018-10-03 20:58:55 - Re: pymysql.err.ProgrammingError: (1064...
|
Cioè, ma... sanity check prima di andare avanti. Non è che per caso (per caso, eh?) hai salvato nel database un valore di TESTO puro che dice esattamente "{'Saldo': 350.5}" (non so, magari perché quel coso deriva da un json, o hai pensato che sarebbe stato figo salvare del json campo di database, o hai fatto qualche altra cosa che non sappiamo)? Perché se così fosse... beh, capisci anche tu, vero... Se hai salvato testo nel database, quando leggi ti restituisce esattamente (esattamente) il testo che hai inserito.
https://pythoninwindows.blogspot.com/p/i-miei-libri.html : i miei libri
https://pythoninwindows.blogspot.com : il mio blog |
|
Scritto da Daniele aka Palmux |
2018-10-03 21:06:26 - Re: pymysql.err.ProgrammingError: (1064...
|
Ho paura...
|
|
Scritto da Kestrel |
2018-10-03 22:32:04 - Re: pymysql.err.ProgrammingError: (1064...
|
State tranquilli che non sono così ignorante (nel senso che ignoro 😁 un concetto così basilare)
A parte gli scherzi il database chiamato cassa contiene due tabelle: 1 causale IDCausale chiave primaria con incremento automatico Causale varchar(45) 2 movimenti IDMovimento chiave primaria auto incremento DataMovimento date IDCausale int Descrizione varchar(45) Importo double Saldo double Considera a che che se cancello tutte le righe, quindi database vuoto, all'avvio dello script mi da effettivamente saldo zero e dopo il primo inserimento lo script come puoi vedere dal codice trasferisce al database una variabile float e il saldo mi viene aggiornato. Help! |
|
Scritto da RicPol |
2018-10-04 15:04:45 - Re: pymysql.err.ProgrammingError: (1064...
|
Uhm, ok allora. Non resta che andare a leggere la documentazione, come ti ho suggerito di fare. Ora, io non uso mysql (se voglio farmi male preferisco la cioccolata) ma ho fatto lo sforzo di sfogliarla cinque minuti, ed è piuttosto evidente il problema. Quel modulo esporta una classe di cursore "evoluto" che restituisce i valori come un dizionario, ed in effetti è quella che hai usato tu. Del resto, rileggendo il tuo post vedo solo adesso che la tua connessione è fatta così
connection = pymysql.connect(host='localhost', .......... cursorclass=pymysql.cursors.DictCursor) e quel "cursorclass=DictCursor" già mette un po' sull'avviso, eh. La morale della favola, suppongo, è che non bisogna limitarsi a copiare gli esempi trovati in giro ma occorre proprio capire le cose passo-passo con la documentazione sotto mano, altrimenti poi ci si trova di fronte a comportamenti che sono difficili da spiegare. Il cursore che usi ti restituisce dizionari. Puoi usare un cursore più "normale" che sputa i risultati come una tradizionale lista di tuple, oppure perché no, puoi continuare a usare DictCursor ma allora devi adattare il resto del tuo codice (in modo che non faccia "float" di tutto il dizionario ma solo del suo valore). https://pythoninwindows.blogspot.com/p/i-miei-libri.html : i miei libri
https://pythoninwindows.blogspot.com : il mio blog |
|
Scritto da Kestrel |
2018-10-04 15:36:49 - Re: pymysql.err.ProgrammingError: (1064...
|
Posso chiederti dove hai trovato la documentazione? Perché io non la trovo o non ne comprendo appieno il significato. Infatti per un neofita come me è facile perdersi nelle innumerevoli informazioni che si possono trovare.
Apprezzo molto il tuo aiuto e ti ringrazio per la pazienza e l'impegno che ci metti. Quindi devo vedere bene la classe cursor della pymysql Saluti --- Ultima modifica di Kestrel in data 2018-10-04 15:38:47 --- |
|
Scritto da RicPol |
2018-10-04 15:46:02 - Re: pymysql.err.ProgrammingError: (1064...
|
https://pythoninwindows.blogspot.com/p/i-miei-libri.html : i miei libri
https://pythoninwindows.blogspot.com : il mio blog |
|
Scritto da Kestrel |
2018-10-04 15:55:34 - Re: pymysql.err.ProgrammingError: (1064...
|
L'avevo vista, ma mi sono perso nelle informazioni e non l'ho visto. Bisogna a essere capaci anche a leggere la documentazione.
Scusa il fastidio |
|
Scritto da Kestrel |
2018-10-09 11:24:04 - Re: pymysql.err.ProgrammingError: (1064...
|
Buongiorno,
sto andando avanti con il codice, apliandolo e risolvendo i problemi che via via incontro, e questo anche grazie ai Vs. prezioni consigli. Vi posto il codice: import pymysql.cursors import datetime print("Benvenuto nel programma EasyMoney") # Connessione conn = pymysql.connect(host="localhost", user="root", password="123", db="cassa", charset="utf8mb4", autocommit=True,) #Andiamo a leggere l'ultimo valore della tavbella movimenti colonna Saldo try: cursor = conn.cursor() sql_saldo = "SELECT Saldo FROM movimenti ORDER BY ID Movimento DESC LIMIT 1;" cursor.execute(sql_saldo) read_db = cursor.fetchone() if read_db == None: saldo = 0 else: saldo = float(read_db[0]) print('Il saldo attuale è €: ',saldo) except: print('Errore!!') # Blocco Variabili da input utente date = input('Inserisci data in formato DD/MM/YYYY: ') day, month, year = map(int, date.split('/')) datam = datetime.date(year, month, day) causale = int(input("Inserire 1 per Entrata e 2 per Uscita :")) descr = input("Descrizione movimento: ") importo = float(input("Importo: ")) # Scrittura database try: with conn.cursor() as cursor: sql_insert = "INSERT INTO movimenti (DataMovimento, ID Causale, Descrizione, Importo, Saldo) VALUES( %s, %s, %s, %s, %s)" if causale == 1 and saldo == 0: saldo = importo elif causale == 1 and saldo > 0: saldo = saldo + importo elif causale == 2 and saldo == 0: print("ATTENZIONE!! - Disponibilità in cassa non sufficente!") # Trovare la fuzione che ritorna alla scelta della causale elif causale == 2 and saldo > importo: saldo = saldo - importo cursor.execute(sql_insert, (datam, causale, descr, importo, saldo)) with conn.cursor() as cursor: sql_select = "SELECT DataMovimento, ID Causale, Descrizione, Importo, Saldo FROM movimenti" cursor.execute(sql_select) #print("Data - Causale - Descrizione - Importo - Saldo") results = cursor.fetchall() for row in results: print(results) finally: conn.close()Vi chiedo ancora un consiglio, Vi ho evidenazito nel codice un elif nella sezione di scrittura dati nel DB. Vorrei infatti che in quella circostanza mi rimandasse indietro negli input per modificare la causale. Come posso fare? Un ultima cosa, come posso cercare la documentazione per formattare l'output della funzione print in modo da avere qualcosa del genere data: / / - descrzoine - importo 0,00 e saldo 0.00 data: / / - descrzoine - importo 0,00 e saldo 0.00 data: / / - descrzoine - importo 0,00 e saldo 0.00 ec.... Grazie |
|
Scritto da RicPol |
2018-10-09 12:59:47 - Re: pymysql.err.ProgrammingError: (1064...
|
Guarda, direi che sei arrivato a fine corsa, con questo approccio. Devi riscrivere tutto il codice daccapo cambiando proprio la struttura. Non puoi pensare che problemi complessi come l'input/output, la logica di business ("mi rimandasse indietro per modificare la causale") etc. possano essere risolti restando nel contesto di quella filastrocca di codice sbattuta a livello di modulo che stai usando.
Devi organizzare il tuo codice in funzioni (e probabilmente in classi). La soluzione "normale" in questi casi sarebbe in effetti lasciar perdere del tutto le soluzioni fatte a mano, e affidarsi a un ORM. Ma insomma, puoi anche provare senza un ORM, l'importante è che tu capisca che devi organizzare il codice in unità discrete (funzioni, classi) che assolvono certi compiti secondo un'api ben definita. Poi puoi fare interagire questi elementi tra loro. Un elemento si occupa dell'I/O, e chiama le altre funzioni all'occorrenza, e così via. E (prima che inevitabilmente me lo chieda) no: non ti posso "fare un esempio al volo", perché è lungo e non ha senso. Impara prima a usare bene le funzioni (e le classi, probabilmente), e poi torna ai database e al tuo problema. https://pythoninwindows.blogspot.com/p/i-miei-libri.html : i miei libri
https://pythoninwindows.blogspot.com : il mio blog |
|
Scritto da Kestrel |
2018-10-09 16:44:30 - Re: pymysql.err.ProgrammingError: (1064...
|
Perfetto, mi metto a lavoro e se sarà il caso (molto probabilmente) tornerò con tuo permesso a romperti le p.....e.
Magari aprendo un altro post. Grazie |
Pagina: Indietro 1 2
Esegui il login per scrivere una risposta.