【问题标题】:The default sorting criteria of sqlalchemy?sqlalchemy 的默认排序标准?
【发布时间】:2012-12-30 22:34:14
【问题描述】:

现在我按属性 1 对数据库中的数据进行排序。 如果属性 1 的值相同的不同项目存在并列,则数据似乎按其 id 排序。 但是,我想通过按 desc(id) 排序来打破平局。如果出现平局,如何更改数据库的默认排序标准?

谢谢!

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    更新

    从 1.1 版开始,映射器配置 has been deprecated 中的 order_by 参数。而是必须使用 Query.order_by

    出于历史目的,我将原始答案留在这里

    这可以通过[映射器配置][1]来实现。

    如果您有一个用户表并且想要检索始终按fullname 排序的记录,则应该这样:

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String
    
    Base = declarative_base()
    
    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, primary_key=True)
        name = Column(String)
        fullname = Column(String)
        password = Column(String)
    
        __mapper_args__ = {
            "order_by": fullname,
        }
        
        def __repr__(self):
           return f"<User(id='{self.id}', name='{self.name}', fullname='{self.fullname}')>"
    

    默认order_by是升序,如果你想颠倒顺序可以使用:

    __mapper_args__ = {
        "order_by": fullname.desc(),
    }
    
    
    
    
      [1]: http://docs.sqlalchemy.org/en/latest/orm/mapping_api.html#sqlalchemy.orm.mapper.params.order_by
    

    【讨论】:

    • 在映射器配置中添加默认排序自 1.1 版以来已被弃用,以支持显式使用 Query.order_by()
    • desc 以防你需要它__mapper_args__ = { "order_by": id.desc() }
    【解决方案2】:

    顺序完全由数据库决定,而不是 SQLAlchemy。使用纯 SQL,您只需添加额外的 ORDER BY 子句,在 SQLAlchemy ORM 中,您可以通过链接 order_by 方法来执行相同的操作。例如:

    for eq in session.query(Equipment).order_by(Equipment.model_id).order_by(Equipment.name).all():
        print (eq)
    

    最左边的是主排序。

    【讨论】:

    • 顺便说一句,this question 回答了如何使用 SQLAlchemy 对 DESC 进行排序。
    • 非常感谢,这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多