在我的文章模型中,我有一个date_edited和date_created列,我想按两者中的最新顺序进行排序。有没有一种方法可以使用SQLAlchemy order_by?我真的很想避免此时更改模型。
答案 0 :(得分:0)
我不太确定您的架构是什么样子,但这可能会使您走上寻找解决方案的正确道路:
假设您的时间戳记以Integer
或Float
的形式存储,则获取两个日期中的较新值就像查找两个数字中的较大者一样简单。
没有一种超级简单的方法来获得两个数字中的较大者,例如数学库函数MAX(x, y)
返回x if x > y else y
,但是您可以使用CASE
语句来模仿它:
CASE
WHEN (table.date_edited > table.date_created)
THEN table.date_edited
ELSE table.date_created
END
您可以在SQLAlchemy中使用case expression进行此操作。
from sqlalchemy import func
# [...]
myquery = myquery.order_by(
db.case(
[(Table.date_created > Table.date_edited, Table.date_created)],
else_=Table.date_edited
)
)
为避免将来出现这种情况,您可以考虑将date_edited
列设置为在创建后自动更新,使其与date_created
列自动匹配(只要date_edited
用于跟踪上一次编辑,而不是根本没有记录),因此您只需要担心按date_edited
进行排序。 (您可以运行查询,UPDATE table SET date_edited=date_created WHERE date_edited=NULL;
首先进行此操作,然后确保以后的代码保持一致)。