zoukankan      html  css  js  c++  java
  • sqlalchemy & python & datatables & javascript 中文拼音排序

    近期有中文拼单排序需要,查询资料,mysql数据库有convert函数支持

     select cname from channel order by convert(cname using gbk);
    # cname字段使用utf8,默认的话,汉字转换为uft8码,然后再排序,顺序肯定有问题。使用convert将汉字转为gbk,就符合拼音排序
    
    # https://datatables.net/plug-ins/sorting/
    datatables的自定义排序,只作用于客户端页面排序,后台排序不适用。
    
    我的程序涉及接口、datatable页面,需要变更后台程序。使用pypinyin模块进行中英文混排,因为使用了sqlalchemy,在order_by的时候,必须用cast函数将字段进行转换。
    比如 字符数字变更为数字等,中文字符utf8转为中文拼音 。
    
    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']
    
  • 相关阅读:
    IE6 兼容问题总结
    WPF 带CheckBox、图标的TreeView
    Fast Report Data Filter
    【转】NHibernate入门教程
    【转】Spring.NET学习笔记——目录
    【转】.Net中通过反射技术的应用----插件程序的开发入门
    【转】ASP.NET常用数据绑定控件优劣总结
    【转】通用分页用户控件(DataGrid,DataList,Repeater都可以用它来分页)
    【转】ASP.NET MVC教程
    【转】设计模式介绍
  • 原文地址:https://www.cnblogs.com/liujitao79/p/8036626.html
Copyright © 2011-2022 走看看