如何在 Flask-SQLAlchemy 中执行多个“order_by”?

Posted

技术标签:

【中文标题】如何在 Flask-SQLAlchemy 中执行多个“order_by”?【英文标题】:How can I do multiple "order_by" in Flask-SQLAlchemy? 【发布时间】:2013-03-25 09:06:24 【问题描述】:

假设我有一个User 模型,其中包含popularitydate_created 字段。我想做以下查询:

SELECT * FROM user ORDER BY popularity DESC, date_created DESC LIMIT 10

在 SQLAlchemy 中,对于单个这样的工作:

User.query.order_by(User.popularity.desc()).limit(10).all()

我应该再添加一个order_by() 吗?或者将popularitydate_created 都放在我当前的order_by() 中?

我希望popularity 优先于date_created 进行订购。

【问题讨论】:

【参考方案1】:

这应该可以工作

User.query.order_by(User.popularity.desc(), User.date_created.desc()).limit(10).all()

【讨论】:

好吧,事实是我尝试了User.query.order_by(User.popularity.desc(),User.date_created.desc()).limit(10).all()User.query.order_by(User.popularity.desc()).order_by(User.date_created.desc()).limit(10).all()User.query.order_by(User.date_created.desc()).limit(10).all(),他们给了我不同的结果......所以看起来给第二个 order_by 既不会覆盖第一个也不会添加订单第一个条件? (这些查询都没有失败,它们都给了我结果,我只是不知道前两个中的哪一个是我想要的) 好的,实际上两者都给了我相同的答案,并且我发现了底层 SQL 查询(感谢***.com/questions/4617291/…),它们确实是相同的,而且是正确的。对不起,非常感谢您的回答!【参考方案2】:

你还可以做什么:

from sqlalchemy import and_, or_
User.query.order_by(and_(User.popularity.desc(), User.date_created.desc())).all()

注意:and_or_ 来自 sqlalchemy 库,而不是来自 flask_sqlalchemy 库。 sqlalchemy 是 flask_sqlalchemy 的依赖,所以你应该很好。

LTS:您可以将 sqlalchemy 库与 flask_alchemy 库混合使用

【讨论】:

【参考方案3】:

你也可以像这样使用sqlalchemy.sql.text

from sqlalchemy.sql import text

User.query.order_by(text("popularity desc, date_created desc")).limit(10).all()

【讨论】:

从我的测试来看,如果你从不受信任的来源获得它,你似乎需要清理进入text() 的内容。例如,SQLAlchemy 很高兴地允许:.order_by(text('id desc; DROP TABLE important_table;')) 进入生成的 SQL,尽管在我的情况下其他一些错误阻止了它的执行。【参考方案4】:

我还有一个例子:

user = User.query.order_by(User.id.desc()).limit(10).all()

s.t

用户是我的类 db.Modle

【讨论】:

以上是关于如何在 Flask-SQLAlchemy 中执行多个“order_by”?的主要内容,如果未能解决你的问题,请参考以下文章

在多租户应用程序中动态设置 Flask-SQLAlchemy 数据库连接

Flask-SQLAlchemy 多对多插入

使用flask-restplus在flask-SQLAlchemy中创建多对多关联表时出错

flask-sqlalchemy 一对一,一对多,多对多操作

如何在 Celery 任务中使用 Flask-SQLAlchemy

Flask-SQLAlchemy 数据库一对多