本文共 1496 字,大约阅读时间需要 4 分钟。
AttributeError: ‘str’ object has no attribute ‘microseconds’
报错过程:
- 执行了一个flask_sqlalchemy的查询语句,然后就报如上这个错误
- 执行的语句为:result_object_list = TaskReport.query.filter(TaskReport.task_id == “1000000046”).all()
- 在其他相似表格也做过类似的查询,也完美执行了,没报任何错误!
- 对比了一下,其他表格保存的数据也和这张表格一样,数据没问题的!
核心报错的代码也贴出来:
def result_processor(self, dialect, coltype): time = datetime.time def process(value): # convert from a timedelta value if value is not None: microseconds = 0 microseconds = value.microseconds # 这一行是核心报错的代码 seconds = value.seconds minutes = seconds // 60 return time( minutes // 60, minutes % 60, seconds - minutes * 60, microsecond=microseconds, ) else: return None return process
- 经过排查,发现我保存的数据是字符串,但系统代码执行到报错的地方的时候,直接执行value.microseconds报错了,因为获取到的value是字符串类型,字符串当然无法获取到对应的微妙数据
- 后来,把数据库对应的start_time数据类型都改为time类型(长度为0,意思是毫秒不显示)
- 再后来,再执行如上代码,发现一切正常了!
最初把时间格式都设置为varchar类型,就是为了避免各种时间的转换,省点事情的,现在又改回为time类型,感觉不是很爽,再找找原因!
经过排查,发现出问题的表格对应的模型类如下所示:
- 虽然我在表格中,把start_time写为字符串varchar类型,
- 但是, 实际的数据表格模型类中, 我把start_time的数据类型写为time类型
- 当使用TaskReport这个模型类去搜索的时候,它会根据这个模型类的数据类型去搜索内容,而不是根据你表格的实际数据类型去搜索
- 如果是time类型的数据,在报错的代码部分,是可以通过value.microseconds获取毫秒数据的。但因为模型类是time类型,而实际是字符串类型,在按照time类型处理数据的时候,就报错了!
数据库表格对应的字段类型, 一定要与表格模型类的字段类型一直,实时保持同步,这样即使出现其他问题也很容易排查了!
转载地址:http://mteab.baihongyu.com/