将Python datetime.datetime对象插入MySQL


120

我在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


您错过了报价%s cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s , '%s')",("name", 4,now))
Sheshnath

Answers:


198

对于时间字段,请使用:

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

我认为strftime也适用于日期时间。


4
另外,请确保您的列名不是保留字。花了30分钟,让我意识到“ current_date”这个名称引起了问题...呃!
Pakman

2
什么是time在这个例子吗?
James McMahon

1
J McMahon:时间是一个Python模块。
dstromberg'9

如果有人想获取唯一的年,月,日该怎么办?
Pooja Khatri

42

您最有可能收到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')

希望这可以帮助。


8
您可能没有引号包围%spymsql
Martin Thoma 2015年

1
当我尝试此操作时,第三个%s周围的引号引起错误。
realjin

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

您是否不需要在字符串参数即“ ... VALUES('%s','%s','%s')”周围添加引号
Gareth Simpson

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

时区

如果需要考虑时区,则可以按如下所示为UTC设置MySQL时区:

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

时区可以在Python中设置:

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

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”是非法的(具有无意义的分钟部分),并变为“ 0000-00-00 00”: 00:00'。

如果数字是日期,则以YYYYMMDDHHMMSS或YYMMDDHHMMSS格式表示。例如,将19830905132800和830905132800解释为“ 1983-09-05 13:28:00”。


3

您要连接到哪个数据库?我知道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之类的工具将消除此类差异,并使您的生活变得轻松。


我不建议使用datetime.isoformat(),因为如果使用时区感知对象,则生成的字符串将包含时区数据,并且不再与所需的mysql格式匹配。
弗兰克斯特

0

如果您仅使用python datetime.date(而不是完整的datetime.datetime),则将日期转换为字符串。这非常简单,对我有用(mysql,python 2.7,Ubuntu)。该列published_date是一个MySQL日期字段,python变量publish_datedatetime.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

当烦恼到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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.