Forum >> Programmazione Python >> Database >> pymysql.err.ProgrammingError: (1064...

Pagina: Indietro 1 2

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.

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.
Ho paura... :)

:) 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! :sarcastic:










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).




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 ---
:) 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 :angel:

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






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.

Perfetto, mi metto a lavoro e se sarà il caso (molto probabilmente) tornerò con tuo permesso a romperti le p.....e. :D :D :D


Magari aprendo un altro post.





Grazie




Pagina: Indietro 1 2



Esegui il login per scrivere una risposta.