如何在 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
模型,其中包含popularity
和date_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()
吗?或者将popularity
和date_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-restplus在flask-SQLAlchemy中创建多对多关联表时出错
flask-sqlalchemy 一对一,一对多,多对多操作