Sto scrivendo un programma Python che deve inserire in una tabella di un db MySQL alcuni campi letti da un file; alcuni di questi sono di tipo data e sono formattati con il formato “%d-%m-%Y” (per esempio: “25/12/2020”) per cui nel programma devo rovesciare giorno e anno per presentarli a MySQL perché interpret la stringa come una data.
Orbene la seguente riga intesa a svolgere questo compito, non funziona (ometto la definizione della connessione e del cursore):
query = "select str_to_date(substring(%s,1,25), '%d-%m-%Y') data" prm=list() prm.append('16-04-2021') print(prm) cur.execute(query, prm) for row in cur.fetchall(): print("------------> ",row[0])
Quello che capita è questo:
Traceback (most recent call last): File "./mail.py", line 46, in cur.execute(query, prm) File "/usr/lib/python3/dist-packages/MySQLdb/cursors.py", line 206, in execute raise ProgrammingError(str(m)) MySQLdb._exceptions.ProgrammingError: not enough arguments for format string
Sommario
Dov’è che Python si incasina?
Ora, il casino deriva dalla notazione % che si usa sia per i parametri della query SQL che per il formato della data.
Pensavo che il parser ci arrivasse da solo visto che la stringa di formato è racchiusa da virgolette, e invece no. Ingenuo che sono, dopo tanti anni non ho ancora imparato!
Per risolvere questo problema occorre applicare un carattere di escape alla stringa di formato, nel modo seguente
query = "select str_to_date(substring(%s,1,25), '%%d-%%m-%%Y') data"
Nota il doppio %%.
Facendo così il programma termina correttamente
------------> 2021-04-16
In realtà il formato della data è un po’ più complicato di così, ma l’ho semplificato per circoscrivere il problema.
Commenti recenti