【问题标题】:How can I do multiple "order_by" in Flask-SQLAlchemy?如何在 Flask-SQLAlchemy 中执行多个“order_by”?
【发布时间】: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 进行订购。

【问题讨论】:

    标签: postgresql sqlalchemy flask flask-sqlalchemy


    【解决方案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 查询(感谢stackoverflow.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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 2018-02-18
        • 1970-01-01
        • 2013-08-01
        • 2021-11-16
        • 1970-01-01
        相关资源
        最近更新 更多