it-swarm.com.de

Ein Python-Objekt datetime.datetime in MySQL einfügen

Ich habe eine Datumsspalte in einer MySQL-Tabelle. Ich möchte ein datetime.datetime()-Objekt in diese Spalte einfügen. Was soll ich in der Execute-Anweisung verwenden?

Ich habe versucht:

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

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

Ich erhalte eine Fehlermeldung als: "TypeError: not all arguments converted during string formatting" Was sollte ich anstelle von %s verwenden?

100
Scaraffe

Für ein Zeitfeld verwenden Sie:

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

Ich denke, dass strftime auch für datetime gilt.

169
g33kz0r

Sie erhalten höchstwahrscheinlich TypeError, weil Sie den Datumsspaltenwert in Anführungszeichen setzen müssen.

Versuchen:

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

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

In Bezug auf das Format hatte ich Erfolg mit dem obigen Befehl (der die Millisekunden umfasst) und mit:

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

Hoffe das hilft.

38
Edvinas

Verwenden Sie now.date(), um ein Date-Objekt statt einer DateTime abzurufen.

Wenn das nicht funktioniert, sollte das Konvertieren in einen String funktionieren:

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))
10
Wogan

Mit welcher Datenbank verbinden Sie sich? Ich weiß, dass Oracle hinsichtlich Datumsformaten und dem ISO 8601 -Format wählerisch sein kann.

** Hinweis: Ups, ich habe gerade gelesen, dass Sie MySQL verwenden. Formatieren Sie einfach das Datum und testen Sie es als separaten direkten SQL-Aufruf.

In Python können Sie ein ISO-Datum wie erhalten

now.isoformat()

Zum Beispiel mag Oracle Termine wie

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

Abhängig von Ihrer Datenbank müssen Sie bei Oracle möglicherweise TO_DATE:

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

Die allgemeine Verwendung von TO_DATE ist:

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

Wenn Sie eine andere Datenbank verwenden (ich habe den Cursor gesehen und gedacht, Oracle; ich könnte mich irren), dann überprüfen Sie deren Datumsformat-Tools. Für MySQL ist dies DATE_FORMAT () und SQL Server ist CONVERT.

Auch die Verwendung eines Tools wie SQLAlchemy beseitigt diese Unterschiede und macht Ihr Leben leicht.

2

Wenn Sie nur ein Python datetime.date verwenden (kein vollständiges datetime.datetime), wandeln Sie das Datum einfach als Zeichenfolge um. Dies ist sehr einfach und funktioniert für mich (mysql, python 2.7, Ubuntu). Die Spalte published_date ist ein MySQL-Datumsfeld, die Python-Variable publish_date ist 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:
    ...
0
jbartas

Verwenden Sie die Python-Methode datetime.strftime(format) , wobei 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')))

Zeitzonen

Wenn Zeitzonen ein Problem darstellen, kann die MySQL-Zeitzone wie folgt auf UTC eingestellt werden:

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

Und die Zeitzone kann in Python eingestellt werden:

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

MySQL-Dokumentation

MySQL erkennt DATETIME- und TIMESTAMP-Werte in folgenden Formaten:

Als Zeichenfolge im Format 'JJJJ-MM-TT HH: MM: SS' oder 'JJ-MM-TT HH: MM: SS' . Auch hier ist eine „entspannte“ Syntax zulässig: Als Trennzeichen zwischen Datums- und Zeitteilen kann ein beliebiges Interpunktionszeichen verwendet werden. Beispiel: "2012-12-31 11:30:45", "2012 ^ 12 ^ 31 11 + 30 + 45", "2012/12/31 11 * 30 * 45" und "2012 @ 12 @ 31 11" ^ 30 ^ 45 'sind gleichwertig.

Das einzige Trennzeichen, das zwischen einem Datums- und einem Zeitteil und einem Sekundenbruchteil erkannt wird, ist der Dezimalpunkt.

Die Datums- und Zeitteile können durch ein T und nicht durch ein Leerzeichen getrennt werden. Beispiel: "2012-12-31 11:30:45" "2012-12-31T11: 30: 45" sind gleichwertig.

Als Zeichenfolge ohne Begrenzer im Format "JJJJMMTTHHMMSS" oder "JJJMMTTHHMMSS", sofern die Zeichenfolge als Datum sinnvoll ist. Beispielsweise werden '20070523091528' und '070523091528' als '2007-05-23 09:15:28' interpretiert, aber '071122129015' ist illegal (es hat einen unsinnigen Minutenanteil) und wird zu '0000-00-00 00: 00:00 '.

Als Zahl im Format YYYYMMDDHHMMSS oder YYMMDDHHMMSS, sofern die Zahl als Datum sinnvoll ist. Beispielsweise werden 19830905132800 und 830905132800 als "1983-09-05 13:28:00" interpretiert.

0