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

时间:2015-04-07 10:21:29

标签: python mysql sorting sqlalchemy

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

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 ???

这似乎适用于只涉及一个queries的{​​{1}}。我现在正在尝试弄清楚如何为最后两个column语句执行此操作,但似乎无法使if正确。

这甚至可能吗?

对此的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

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)