sqlalchemy解决按照某个字段转拼音排序的问题

0 评论
/ /
1057 阅读
/
1551 字
26 2018-06

方法一,在创建数据的时候将药排序的字段转成拼音,保存起来,获取的时候按照拼音字段排序

方法二,使用from_statement(“ select department_name,mch_key from qz_order order by convert(department_name using gbk)”)就可以达到

方法三, 

sqlalchemy 没有定义convert函数,仅支持cast函数,我开始使用 cast(T.name, Custom)自定义列类型,失败,数据库层面排序实现困难。
改变思路,在返回结果,进行排序处理。


# 返回datatable数据
    data = [{
        'uuid': q.uuid,
        'name': q.name,
        'cname': q.cname,
        'tname': q.tname,
        'category': q.category,
        'sort_id': q.sort_id,
        'product': q.product,
        'status': q.status,
        'create_time': q.create_time,
        'update_time': q.update_time
    } for q in query.items]

    # 排序, 支持中文排序
    reverse = False if order == 'asc' else True

    if order_name in ['product']:
        data = sorted(data, key=lambda k: len(k[order_name].split(',')) if k[order_name] else '', reverse=reverse)
    elif order_name in ['sort_id']:
        data = sorted(data, key=lambda k: (len(k[order_name]), k[order_name])  if k[order_name] else '', reverse=reverse)
    elif order_name in ['cname', 'tname', 'category']:
        data = sorted(data, key=lambda k: lazy_pinyin(k[order_name]) if k[order_name] else '', reverse=reverse)
    else:
        data = sorted(data, key=lambda k: k[order_name], reverse=reverse)

其中有个小插曲,自然排序,一条语句搞定,神来之笔是生成位数与数据的元组,先比较位数,同位数再比较内容。
data = ['10', 'a2', '45', 'b32', '9', '0']
sorted(data, key=lambda x: (len(x), x))

['0', '9', '10', '45', 'a2', 'b32']