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 ?

1voto

jbartas Points 1

Si vous utilisez simplement une date python datetime.date (et non une datetime.datetime complète), il suffit de convertir la date en chaîne de caractères. C'est très simple et fonctionne pour moi (mysql, python 2.7, Ubuntu). La colonne published_date est un champ de date MySQL, la variable python publish_date est datetime.date .

# make the record for the passed link info
sql_stmt = "INSERT INTO snippet_links (" + \
    "link_headline, link_url, published_date, author, source, coco_id, link_id)" + \
    "VALUES(%s, %s, %s, %s, %s, %s, %s) ;"

sql_data = ( title, link, str(publish_date), \
             author, posted_by, \
             str(coco_id), str(link_id) )

try:
    dbc.execute(sql_stmt, sql_data )
except Exception, e:
    ...

0voto

Sunil Points 31
    dt= datetime.now()

    query = """INSERT INTO table1(python_Date_col)
               VALUES (%s)
            """
    conn = ...... # Connection creating process
    cur = conn.cursor()
    cur.execute(query,(dt))

Le code ci-dessus échouera car "datetime.now()" produit "datetime.datetime(2014, 2, 11, 1, 16)" comme valeur de paramètre à l'instruction d'insertion.

Utilisez la méthode suivante pour capturer la date qui donne une valeur de chaîne.

    dt= datetime.now().strftime("%Y%m%d%H%M%S")

J'ai pu exécuter le code avec succès après le changement...

-1voto

Lors de l'insertion dans t-sql

cela échoue :

select CONVERT(datetime,'2019-09-13 09:04:35.823312',21)

ça marche :

select CONVERT(datetime,'2019-09-13 09:04:35.823',21)

moyen facile :

regexp = re.compile(r'\.(\d{6})')
def to_splunk_iso(dt):
    """Converts the datetime object to Splunk isoformat string."""
    # 6-digits string.
    microseconds = regexp.search(dt).group(1)
    return regexp.sub('.%d' % round(float(microseconds) / 1000), dt)

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