【发布时间】:2016-08-10 18:34:28
【问题描述】:
我正在从 mySQL 数据库中读取各种数据类型。第五列在数据库中具有类型“DATETIME”。我将其用作“BloodTraitRecord”对象的 entry_date。
import mysql.connector
from datetime import timedelta
from datetime import datetime
show_DB = """select RUID, test_sname, test_value, units, ref_range, entry_date from %s
where RUID=%%s and test_sname=%%s order by RUID,
test_sname, entry_date Limit 5;""" % (tableToUse,)
cursor.execute(show_DB, (ruid, traitPair[0]))
resultsForOneTrait = cursor.fetchall()
for result in resultsForOneTrait:
ruid = result[0]
s_name = result[1].decode("UTF-8")
value = result[2]
units = result[3].decode("UTF-8")
ref_range = result[4].decode("UTF-8")
# Need assistance here
entryDate = result[5]
record = BloodTraitRecord(ruid, s_name, value, units, ref_range, entryDate)
BloodTraitRecord 类:
class BloodTraitRecord:
def __init__(self, ruid, test_sname, test_value, units, ref_range, entry_date):
self.RUID = ruid
self.test_sname = test_sname
self.test_value = test_value
self.units = units
self.ref_range = ref_range
self.entry_date = entry_date
数据库中的 DATETIME 对象在 mySQL 服务器中如下所示:
'2008-11-14 13:28:00'
除非数据库中的时间是午夜,否则代码会按预期运行,如下所示:
'2014-05-18 00:00:00'
在这种情况下,并且仅在这种情况下,在将记录的 entry_date.date() 与代码后面的另一个 datetime.date 进行比较时,我会收到此错误:
# 'cancerCutoff' is consistently a datetime.date
cancerCutoff = firstCancerAnemiaCodeDate[ruidkey] - timedelta(days=180)
if cancerCutoff < record.entry_date.date():
AttributeError: 'datetime.date' object has no attribute 'date'
打印 record.entry_date 确认此案例的时间属性已消失:
'2014-05-18'
我有办法通过检查对象的类型来解决此问题,并且仅在对象是日期时间时才调用 date 属性,但我想知道是否有比这更好的解决方法。
我也不明白为什么当 DATETIME 时间为 00:00:00 时,python 会立即将 MySQL DATETIME 转换为 datetime.date。
感谢您的帮助!
【问题讨论】:
-
你是说如果值包括午夜,Python 会将 MySQL DATETIME 转换为
datetime.date,但不是吗?您使用的是什么 ORM 或连接器?貌似mysql.connector,但请在问题中确认。 -
所有这些都是正确的。更新问题。
-
我无法在带有本地 MySQL 5.6.24 服务器的 OSX 上运行
mysql.connector2.1.3 版和 Python 3.5 复制问题。你运行的是什么版本? -
mysql.connector = 2.1.3 版; Python = 3.4.4 版;本地 MySQL 服务器 = 版本 5.7.11。在 Windows 7 上运行。
-
这很奇怪,我看不出任何逻辑原因为什么它会根据午夜的时间将其解析为 datetime.data,也许这是一个特定于 Windows 的问题。附带说明一下,仅使用
self.entry_date = entry_date与您的 if/else 逻辑相同,但如果它是“无”,也会导致错误。
标签: python mysql date datetime