SQLAlchemy order_by编辑日期和创建日期列?

时间:2018-08-03 18:20:30

标签: python sql flask sqlalchemy flask-sqlalchemy

在我的文章模型中,我有一个date_edited和date_created列,我想按两者中的最新顺序进行排序。有没有一种方法可以使用SQLAlchemy order_by?我真的很想避免此时更改模型。

1 个答案:

答案 0 :(得分:0)

我不太确定您的架构是什么样子,但这可能会使您走上寻找解决方案的正确道路:

假设您的时间戳记以IntegerFloat的形式存储,则获取两个日期中的较新值就像查找两个数字中的较大者一样简单。

没有一种超级简单的方法来获得两个数字中的较大者,例如数学库函数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;首先进行此操作,然后确保以后的代码保持一致)。