涛子 - 简单就是美

成单纯魁增,永继振国兴,克复宗清政,广开家必升

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  428 随笔 :: 0 文章 :: 19 评论 :: 22万 阅读

近期有中文拼单排序需要,查询资料,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']
posted on   北京涛子  阅读(510)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
历史上的今天:
2016-12-14 ansible playbook 示例
点击右上角即可分享
微信分享提示