在 MySQL 中插入 Python datetime.datetime 对象

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

307927 次浏览

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

我知道 Oracle 对日期格式很挑剔,而且喜欢 ISO 8601格式。

注意: 哎呀,我刚看到你在使用 MySQL。只需格式化日期,并尝试将其作为一个单独的直接 SQL 调用进行测试。

在 Python 中,您可以获得一个 ISO 日期,如

now.isoformat()

例如,甲骨文喜欢像

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 () ,而 SQLServer 是 CONVERT。

同时使用像 SQLAlchemy这样的工具可以消除这些差异,让你的生活更加轻松。

对于时间字段,请使用:

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

我认为 strftime也适用于 datetime

您很可能会得到 TypeError,因为您需要在 dateccolumn 值周围加上引号。

试试:

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

希望这个能帮上忙。

如果只使用 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:
...

使用 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”或 < strong > ‘ YY-MM-DD HH: MM: SS’中的字符串 这里也允许使用“放松”语法: 任何标点符号 字符可用作日期部分或时间之间的分隔符 例如,’2012-12-3111:30:45’,’2012 ^ 12 ^ 3111 + 30 + 45’, ‘2012/12/3111 * 30 * 45’和‘2012@12@3111 ^ 30 ^ 45’是等价的。

在日期和时间部分与 小数秒部分是小数点。

日期和时间部分可以用 T 而不是空格分隔 例如,’2012-12-3111:30:45’2012-12-31T11:30:45’是相等的。

作为“ YYYYMMDDHMMSS”或“ YYYYMMDDHMMSS”中没有分隔符的字符串 ‘ YYMMDDHHMMSS’格式,前提是字符串作为日期是有意义的。 例如,将“20070523091528”和“070523091528”解释为 “2007-05-2309:15:28”,但“071122129015”是非法的(它有一个 无意义的分钟部分) ,并成为’0000-00-0000:00:00:00’。

以 YYYMMDDHMMSS 或 YYMMDDHHMMSS 格式提供的数字 例如,19830905132800及 830905132800被解释为“1983-09-0513:28:00”。

当插入 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)
    dt= datetime.now()


query = """INSERT INTO table1(python_Date_col)
VALUES (%s)
"""
conn = ...... # Connection creating process
cur = conn.cursor()
cur.execute(query,(dt))

以上代码将失败,因为“ datetime.now ()”将生成“ datetime.datetime (2014,2,11,1,16)”作为插入语句的参数值。

使用以下方法捕获提供字符串值的 datetime。

    dt= datetime.now().strftime("%Y%m%d%H%M%S")

修改之后我成功地运行了代码。

例如 date 是5/5/22,将其转换为 mysql 日期格式2022-05-05,以便在 mysql 数据库中插入记录 月份 % d 日期 年份百分比(4位数字) % y2位数

密码如下:

from datetime import datetime
now='5/5/22'
print("Before", now)
now= datetime.strptime(dob,'%m/%d/%y').strftime('%Y-%m-%d')
print("After", now)
cursor.execute("INSERT INTO table (name, id, datecolumn) VALUES (%s, %s, %s)",(name, 4,now))

产出:

在5/5/22之前

2022-05-05之后
(可以轻松插入数据库的 mysql 格式) it will be inserted in mysql table