Вставка объекта Python datetime.datetime в MySQL - PullRequest
105 голосов
/ 16 июля 2009

У меня есть столбец даты в таблице MySQL. Я хочу вставить объект datetime.datetime() в этот столбец. Что я должен использовать в операторе execute?

Я пробовал:

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

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

Я получаю сообщение об ошибке: "TypeError: not all arguments converted during string formatting" Что я должен использовать вместо %s?

Ответы [ 6 ]

174 голосов
/ 22 декабря 2010

Для поля времени используйте:

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

Я думаю, что strftime также применяется к datetime.

40 голосов
/ 30 августа 2012

Скорее всего, вы получаете TypeError, потому что вам нужны кавычки вокруг значения datecolumn.

Попытка:

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

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

Что касается формата, у меня был успех с вышеуказанной командой (которая включает в себя миллисекунды) и с:

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

Надеюсь, это поможет.

11 голосов
/ 16 июля 2009

Попробуйте использовать now.date(), чтобы получить Date объект, а не DateTime.

Если это не сработает, то преобразование в строку должно работать:

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))
2 голосов
/ 16 июля 2009

К какой базе данных вы подключаетесь? Я знаю, что Oracle может быть разборчива в форматах даты и любит формат ISO 8601 .

** Примечание: Ой, я только что прочитал, что вы на MySQL. Просто отформатируйте дату и попробуйте использовать ее как отдельный прямой вызов SQL для проверки.

В Python вы можете получить дату ISO, например

now.isoformat()

Например, Oracle любит даты вроде

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

В зависимости от вашей базы данных, если это Oracle, вам может понадобиться TO_DATE:

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

Общее использование TO_DATE:

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

Если вы используете другую базу данных (я увидел курсор и подумал, что Oracle; я могу ошибаться), тогда проверьте их инструменты форматирования даты. Для MySQL это DATE_FORMAT (), а для SQL Server это CONVERT.

Также использование такого инструмента, как SQLAlchemy , устранит подобные различия и облегчит вашу жизнь.

0 голосов
/ 14 апреля 2019

Использовать метод Python datetime.strftime(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')))

1008 * Часовые пояса * Если часовые пояса имеют значение, часовой пояс MySQL можно установить для UTC следующим образом: cursor.execute("SET time_zone = '+00:00'") И часовой пояс можно установить в Python: now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc) Документация MySQL

MySQL распознает значения DATETIME и TIMESTAMP в следующих форматах:

В виде строки в 'ГГГГ-ММ-ДД ЧЧ: ММ: СС' или 'ГГ-ММ-ДД ЧЧ: ММ: СС' формат. Здесь также разрешен «расслабленный» синтаксис: любая пунктуация символ может использоваться в качестве разделителя между частями даты или временем частей. Например, «2012-12-31 11:30:45», «2012 ^ 12 ^ 31 11 + 30 + 45», '2012/12/31 11 * 30 * 45' и '2012 @ 12 @ 31 11 ^ 30 ^ 45' эквивалентны.

Единственный разделитель, распознаваемый между частью даты и времени и доля дробных секунд - десятичная точка.

Дата и время могут быть разделены символом T, а не пробелом. За Например, «2012-12-31 11:30:45» 2012-12-31T11: 30: 45 эквивалентны.

В виде строки без разделителей в «ГГГГММДДЧЧММСС» или Формат «ГГММДДЧЧММСС», при условии, что строка имеет смысл в качестве даты. Например, «20070523091528» и «070523091528» интерпретируются как '2007-05-23 09:15:28', но '071122129015' недопустимо (оно имеет бессмысленная минутная часть) и становится «0000-00-00 00:00:00».

В виде числа в формате ГГГГММДДЧЧММСС или ГГММДДЧЧММСС что число имеет смысл как дата. Например, 19830905132800 и 830905132800 интерпретируются как «1983-09-05 13:28:00».

0 голосов
/ 16 мая 2017

Если вы просто используете python datetime.date (не полный datetime.datetime), просто приведите дату в виде строки Это очень просто и работает для меня (MySQL, Python 2.7, Ubuntu). Столбец published_date является полем даты MySQL, переменная python publish_date равна 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:
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...