在 SQLAlchemy 中对多列进行排序的语法
Syntax to sort more than one column in 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 ???
这似乎适用于仅涉及一个 column
的 queries
。我现在正试图弄清楚如何为最后两个 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)
我目前正在使用 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 ???
这似乎适用于仅涉及一个 column
的 queries
。我现在正试图弄清楚如何为最后两个 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)