Вставка объекта datetime.datetime Python в MySQL

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

Я пробовал:

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?

Ответ 1

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

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

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

Ответ 2

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

Try:

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')

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

Ответ 3

Попробуйте использовать 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))

Ответ 4

В какую базу данных вы подключаетесь? Я знаю, что 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, удаляются такие различия и облегчаются жизнь.

Ответ 5

Используйте метод Python datetime.strftime(format), где 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')))

Часовые пояса

Если часовые пояса являются проблемой, часовой пояс MySQL может быть установлен для UTC следующим образом:

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

И часовой пояс может быть установлен в Python:

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

Документация MySQL

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

В виде строки в формате "YYY Y- ММ-ДД ЧЧ: ММ: СС" или "Y Y- ММ-ДД ЧЧ: ММ: СС". Здесь также разрешен "смягченный" синтаксис: любой символ пунктуации может использоваться в качестве разделителя между частями даты или частями времени. Например, "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".

Ответ 6

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

Ответ 7

при переходе в t-sql

это терпит неудачу:

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

это работает:

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

простой способ:

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)