148 votes

Insertion d'un objet Python datetime.datetime dans MySQL

J'ai une colonne de date dans une table MySQL. Je veux insérer un datetime.datetime() dans cette colonne. Que dois-je utiliser dans l'instruction d'exécution ?

J'ai essayé :

now = datetime.datetime(2009,5,5)

cursor.execute("INSERT INTO table
(name, id, datecolumn) VALUES (%s, %s
, %s)",("name", 4,now))

J'obtiens une erreur comme : "TypeError: not all arguments converted during string formatting" Que dois-je utiliser à la place de %s ?

234voto

g33kz0r Points 3047

Pour un champ de temps, utilisez :

import time    
time.strftime('%Y-%m-%d %H:%M:%S')

Je pense strftime s'applique également à datetime .

49voto

Edvinas Points 143

Vous obtenez très probablement l'erreur de type parce que la valeur de la colonne de données doit être entourée de guillemets.

Essayez :

now = datetime.datetime(2009, 5, 5)

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')",
               ("name", 4, now))

En ce qui concerne le format, j'ai eu du succès avec la commande ci-dessus (qui inclut les millisecondes) et avec :

now.strftime('%Y-%m-%d %H:%M:%S')

J'espère que cela vous aidera.

15voto

Wogan Points 9176

Essayez d'utiliser now.date() pour obtenir un Date plutôt qu'un objet DateTime .

Si cela ne fonctionne pas, la conversion en chaîne devrait fonctionner :

now = datetime.datetime(2009,5,5)
str_now = now.date().isoformat()
cursor.execute('INSERT INTO table (name, id, datecolumn) VALUES (%s,%s,%s)', ('name',4,str_now))

13voto

Utiliser la méthode Python datetime.strftime(format) où format = '%Y-%m-%d %H:%M:%S' .

import datetime

now = datetime.datetime.utcnow()

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",
               ("name", 4, now.strftime('%Y-%m-%d %H:%M:%S')))

Fuseaux horaires

Si les fuseaux horaires sont un problème, le fuseau horaire de MySQL peut être réglé sur UTC comme suit :

cursor.execute("SET time_zone = '+00:00'")

Et le fuseau horaire peut être défini en Python :

now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)

Documentation MySQL

MySQL reconnaît les valeurs DATETIME et TIMESTAMP dans ces formats :

En tant que chaîne de caractères dans l'un ou l'autre "AAAA-MM-JJ HH:MM:SS". o "YY-MM-DD HH:MM:SS format. Ici aussi, une syntaxe "détendue" est autorisée : Tout caractère de ponctuation peut être utilisé comme délimiteur entre les parties de date ou d'heure. ou l'heure. Par exemple, '2012-12-31 11:30:45', '2012^12^31 11+30+45', '2012/12/31 11*30*45', et '2012@12@31 11^30^45' sont équivalents.

Le seul délimiteur reconnu entre une partie date et heure et une partie fraction de seconde est le point décimal.

Les parties date et heure peuvent être séparées par un T plutôt que par un espace. Pour Par exemple, "2012-12-31 11:30:45" et "2012-12-31T11:30:45" sont équivalents.

Sous la forme d'une chaîne de caractères sans délimiteur au format 'YYYYMMDDHHMMSS' ou au format "YYMMDDHHMMSS", à condition que la chaîne ait un sens en tant que date. Par exemple, '20070523091528' et '070523091528' sont interprétés comme suit comme '2007-05-23 09:15:28', mais '071122129015' est illégal (il comporte une une partie minute absurde) et devient '0000-00-00 00:00:00'.

En tant que nombre au format AAAAMMJJHHMMSS ou AAMMJJHHMMSS, à condition que que le nombre ait un sens en tant que date. Par exemple, 19830905132800 et 830905132800 sont interprétés comme '1983-09-05 13:28:00'.

3voto

Ryan Christensen Points 4064

À quelle base de données vous connectez-vous ? Je sais qu'Oracle peut être pointilleux sur les formats de date et autres. ISO 8601 format.

**Note : Oups, je viens de lire que vous êtes sur MySQL. Formatez simplement la date et essayez-la en tant qu'appel SQL direct distinct pour la tester.

En Python, vous pouvez obtenir une date ISO comme suit

now.isoformat()

Par exemple, Oracle aime les dates comme

insert into x values(99, '31-may-09');

En fonction de votre base de données, si c'est Oracle, vous devrez peut-être la TO_DATE :

insert into x
values(99, to_date('2009/05/31:12:00:00AM', 'yyyy/mm/dd:hh:mi:ssam'));

L'utilisation générale de TO_DATE est :

TO_DATE(<string>, '<format>')

Si vous utilisez une autre base de données (j'ai vu le curseur et pensé à Oracle ; je peux me tromper), vérifiez leurs outils de formatage de la date. Pour MySQL, il s'agit de DATE_FORMAT() et pour SQL Server, de CONVERT.

En outre, l'utilisation d'un outil comme SQLAlchemy supprimera ces différences et vous facilitera la vie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X