在 SQLAlchemy 中对多列进行排序的语法

Syntax to sort more than one column in SQLAlchemy

我目前正在使用 SQLAlchemyquery 我的数据库:

returnedOrders = session.query(ORDER).join(RESTAURANT, 
                 and_(ORDER.RESTAURANTSID==RESTAURANT.RESTAURANTSID))\
                 .filter(ORDER.RESTAURANTSID==restaurantID)\
                 .order_by(sortOrders(sort_method))\
                 .all()

def sortOrders(sort_method):
    # Date in ascending order
    if sort_method == 'date':
        return ORDER.ORDERSDATE
    # Date in descending order
    elif sort_method == '-date':
        return desc(ORDER.ORDERSDATE)          
    # Restaurant then Cost in ascending order
    elif sort_method == 'restaurant,cost':
        return RESTAURANT.RESTAURANTSNAME, ORDER.ORDERSCOST(???? Error -
                                           SQL expression object or string expected.)
    # Restaurant in ascending order then Cost in descending order
    elif sort_method == 'restaurant,-cost':
        return ???

这似乎适用于仅涉及一个 columnqueries。我现在正试图弄清楚如何为最后两个 if 语句执行此操作,但似乎无法使 syntax 正确。

这可能吗?

如有任何帮助,我们将不胜感激。

它目前不起作用,因为 order_by 不适用于 tuple 个实例。要解决此问题,您需要 扩展 order_by(...) 的参数。一种方法是始终展开(使用 * [star])并且始终 return 元组:

returnedOrders = (session
                  .query(ORDER)
                  .join(RESTAURANT, and_(ORDER.RESTAURANTSID==RESTAURANT.RESTAURANTSID))
                  .filter(ORDER.RESTAURANTSID==restaurantID)
                  .order_by(*sortOrders(sort_method))  # expand tuples
                  .all()
                  )

def sortOrders(sort_method):
    if sort_method == 'date':
        return (ORDER.ORDERSDATE,)  # @new: return tuple
    elif sort_method == '-date':
        return (ORDER.ORDERSDATE.desc(),)  # @new: return tuple
    elif sort_method == 'restaurant,cost':
        return (
            RESTAURANT.RESTAURANTSNAME,
            ORDER.ORDERSCOST,
        )
    elif sort_method == 'restaurant,-cost':
        return (
            RESTAURANT.RESTAURANTSNAME,
            ORDER.ORDERSCOST.desc(),
        )
    else:
        assert False, "Unexpected sort method {}".format(sort_method)