【问题标题】:SQLALchemy custom integer sort orderSQLALchemy 自定义整数排序顺序
【发布时间】:2014-01-16 09:09:41
【问题描述】:

我有一个表,其中有一列整数表示该行的type。这些整数的范围是 1 - 5。如何在 SQLAlchemy 中指定自定义排序顺序,例如,如果我希望行按以下顺序排序 [4, 2, 3, 5, 1]

我知道 Enum 数据类型,但它映射到数据库后端中的 VARCHAR 并且不能更改架构。

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    我猜您一定已经有一些表格,其中包含有关type 或行的一些信息。如果你不这样做,也许你应该有这样一个查找表。如果这个排序总是相同的,我会在这个表中添加一个列来指示排序,加入它并使用它。

    class TypeInfo(Base):
        __tablename__ = 'typeinfo'
        id = Column(Integer, primary_key=True)
        sort_order = Column(Integer)
    
    # assiming the database contains values like:
    tis = [ TypeInfo(id=1, sort_order=50),
            TypeInfo(id=2, sort_order=20),
            TypeInfo(id=3, sort_order=30),
            TypeInfo(id=4, sort_order=10),
            TypeInfo(id=5, sort_order=40),
            ]
    
    # your query might look like below:
    q = session.query(SomeTable)
    q = q.join(TypeInfo, SomeTable.type == TypeInfo.id).order_by(TypeInfo.sort_order)
    

    如果您无法更改数据库,或者排序可能不同,您可以使用 case 表达式解决此问题,尽管它在大型数据集上的执行速度可能不快:

    _whens = {4: 1, 2: 2, 3: 3, 5: 4, 1: 5}
    sort_order = case(value=SomeTable.type, whens=_whens)
    q = session.query(SomeTable)
    q = q.order_by(sort_order)
    

    【讨论】:

    • 这是一种有趣的方法,虽然我不反对创建一个包含排序顺序的表,但这对我来说似乎有点矫枉过正。我个人不会在 SQL 中这样做。数据库为您提供了一些简洁的syntax,例如ORDER BY idx(array[4, 2, 3, 5, 1], s.type)。案例一更接近我的想法,但我会密切关注表现。
    • 经过一些测试,case 表达式运行良好,我没有注意到任何性能下降。感谢您的回答。
    • 这并不能解决瓷砖所代表的一般问题。整数是无限的,所以你不能只创建一个查找表来映射所有可能的值。
    猜你喜欢
    • 1970-01-01
    • 2015-05-12
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多