将Python datetime.datetime对象插入MySQL

时间:2009-07-16 09:29:49

标签: 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))

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

7 个答案:

答案 0 :(得分:172)

对于时间字段,请使用:

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

我认为strftime也适用于datetime。

答案 1 :(得分:39)

您最有可能获得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')

希望这有帮助。

答案 2 :(得分:10)

尝试使用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))

答案 3 :(得分:2)

您要连接的数据库是什么?我知道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这样的工具可以消除这些差异,让您的生活变得轻松。

答案 4 :(得分: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:
    ...

答案 5 :(得分:0)

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

时区

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

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

可以在Python中设置时区:

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

MySQL Documentation

  

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”。

答案 6 :(得分: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)