Python,MySQL e date

Spread the love
Python logo
Python logo

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

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.

Risorse web

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.