SQLALchemy自定义整数排序顺序

Cad*_*nge 1 python sqlalchemy

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

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

van*_*van 6

我猜你必须已经有一些表包含一些关于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)
Run Code Online (Sandbox Code Playgroud)

如果您无法更改数据库,或者排序可能不同,您可以使用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)
Run Code Online (Sandbox Code Playgroud)

  • 经过一些测试,`case` 表达式运行良好,我没有注意到任何性能下降。谢谢你的回答。 (2认同)