将Python datetime.datetime对象插入MySQL

108 python mysql datetime

我在MySQL表中有一个日期列.我想在datetime.datetime()此列中插入一个对象.我应该在执行语句中使用什么?

我试过了:

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

cursor.execute("INSERT INTO table
(name, id, datecolumn) VALUES (%s, %s
, %s)",("name", 4,now))
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:"TypeError: not all arguments converted during string formatting" 我应该使用什么而不是%s

g33*_*z0r 182

对于时间字段,请使用:

import time    
time.strftime('%Y-%m-%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

我认为strftime也适用于datetime.

  • 另外,请确保您的列名不是[保留字](http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html).花了我30分钟意识到"current_date"这个名字造成了问题......呃! (3认同)
  • 在此示例中,“时间”是什么? (2认同)

小智 41

您最有可能获得TypeError,因为您需要围绕datecolumn值的引号.

尝试:

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

cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, '%s')",
               ("name", 4, now))
Run Code Online (Sandbox Code Playgroud)

关于格式,我使用上面的命令(包括毫秒)成功,并且:

now.strftime('%Y-%m-%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

  • 在`pymsql`中,你可能没有'%s`周围的引号. (7认同)

Wog*_*gan 13

尝试使用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))
Run Code Online (Sandbox Code Playgroud)


Chr*_*ert 10

使用 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')))
Run Code Online (Sandbox Code Playgroud)

时区

如果时区是一个问题,MySQL 时区可以设置为 UTC,如下所示:

cursor.execute("SET time_zone = '+00:00'")
Run Code Online (Sandbox Code Playgroud)

时区可以在 Python 中设置:

now = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
Run Code Online (Sandbox Code Playgroud)

MySQL 文档

MySQL 识别以下格式的 DATETIME 和 TIMESTAMP 值:

作为'YYYY-MM-DD HH:MM:SS''YY-MM-DD HH:MM:SS' 格式的字符串。这里也允许使用“宽松”语法:任何标点字符都可以用作日期部分或时间部分之间的分隔符。例如,“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' 是等价的。

作为一个没有分隔符的字符串,格式为“YYYYMMDDHHMMSS”或“YYMMDDHHMMSS”,前提是该字符串作为日期有意义。例如,'20070523091528'和'070523091528'被解释为'2007-05-23 09:15:28',但'071122129015'是非法的(它有一个无意义的分钟部分)并变成'000000 00:00'。

作为 YYYYMMDDHHMMSS 或 YYMMDDHHMMSS 格式的数字,前提是该数字作为日期有意义。例如,19830905132800 和 830905132800 被解释为“1983-09-05 13:28:00”。