4

我在使用 Python/MySQL 的日期时间格式时遇到了一些问题。

我使用以下脚本(由 Python 字典提供)计算日期时间:

tempDate  = str(eachday.get("date").get("year")).zfill(4) + "-" + 
str(eachday.get("date").get("month")).zfill(2) + "-" + 
str(eachday.get("date").get("day")).zfill(2)   + " " + 
str(eachday.get("date").get("hour")).zfill(2)  + ":" + 
str(eachday.get("date").get("min")).zfill(2)   + ":" + 
str(eachday.get("date").get("sec")).zfill(2)

这会产生一个看起来像 的值2012-04-02 04:04:23

我可以毫无问题地插入 MySQL。

sql.execute("""INSERT INTO `db`.`table`(`id`, `fk_id`, `time`, `field1`, `field2`) VALUES (NULL, %s, %s, %s, %s);""", (fk_value, tempDate, value1, value2)) 
DB_CONN.commit()

但是当我尝试使用该日期时间删除任何内容时,

sql.execute("""DELETE FROM `db`.`table` WHERE `time` = "%s";""", (tempDate))
DB_CONN.commit()

它返回有关不正确日期时间值的警告:

Warning: Incorrect datetime value: ''2012-07-17 23:00:00'' for column 'time' at row 1

如何在 Python 中按日期时间删除?这尤其令人困惑,因为插入相同的变量(没有改变)可以完美地工作。

4

2 回答 2

3

您不能"%s"在查询字符串中包含引号;mysqldb 模块为您添加它们(与在INSERT您不尝试在值周围加上引号的情况下所做的相同......)

于 2012-07-08T23:26:07.950 回答
2

您可以轻松使用该datetime模块,该模块在构建日期字符串时受到更多控制:

from datetime import datetime

eachday = {
    'date': {
        'day': 2, 
        'hour': 4, 
        'min': 4, 
        'month': 4, 
        'sec': 23, 
        'year': 2012
    }
}
keys = ('year','month','day','hour','min','sec')
dt = datetime(*(eachday['date'][k] for k in keys))
print dt.strftime('%Y-%m-%d %H:%M:%S')
# '2012-04-02 04:04:23'

坚持使用日期时间的好处在于,无论如何它都是您将从 MySQLdb 获得的本机格式。您可以将其作为没有转换的值传递。所以真的,甚至不需要格式化日期字符串。

sql.execute("DELETE FROM `db`.`table` WHERE `time`=%s", (dt,))

最好将 datetime 值尽可能长时间地保留为 datetime 对象,而不是携带 int 组件。

于 2012-07-08T23:36:12.573 回答