sqlalchemy:在列上调用STR_TO_DATE

时间:2016-07-08 22:57:39

标签: python mysql sqlalchemy

我正在使用原始MySQL查询将我的一些代码移到sqlalchemy上。

我当前遇到的问题是日期时间是由C#工具以字符串格式保存的。不幸的是,表示与Python不匹配(以及它有一组额外的单引号),因此过滤有点麻烦。

以下是保存日期的格式示例:

'2016-07-01T17:27:01'

我可以使用以下MySQL命令将其转换为可用的日期时间:

 STR_TO_DATE(T.PredicationGeneratedTime, \"'%%Y-%%m-%%dT%%H:%%i:%%s'\")

但是,我找不到任何描述如何在使用sqlalchemy过滤时调用内置函数(如STR_TO_DATE)的文档

以下Python代码:

 session.query(Train.Model).filter(cast(Train.Model.PredicationGeneratedTime, date) < start)

正在给我:

 TypeError: Required argument 'year' (pos 1) not found

似乎没有办法指定转换的格式。

注意:我意识到解决方案是修复日期时间的存储方式,但同时我想对现有数据运行查询。

2 个答案:

答案 0 :(得分:1)

cast()你应该使用sqlalchemy.DateTime,而不是(我假设是)a datetime.date - 这是异常的原因。

但是,由于嵌入的单引号,修复它并不会有所帮助。

幸运的是,您表中存储的日期是ISO格式。这意味着词典比较将对日期字符串本身起作用,而不进行强制转换。只要您使用带有周围单引号的start字符串,它就会起作用。

from datetime import datetime

start = "'{}'".format(datetime.now().isoformat())
session.query(Train.Model).filter(Train.Model.PredicationGeneratedTime < start)

答案 1 :(得分:1)

您可以尝试使用func.str_to_date(COLUMN, FORMAT_STRING)代替cast