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']
sqlalchemy & python & datatables & javascript 中文拼音排序的更多相关文章
- JavaScript中文拼音排序函数
要对很多设备根据名称排序,找了找没有找到特别适合的,然后就自己写了一个根据中文拼音首字母排序的方法. github: https://github.com/haboll/sort.git
- Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序
发布时间:2018-11-16 技术:Android 概述 最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示: 简体中文 拼音排 ...
- C++ 中文拼音排序方法。
参考文档:http://zisxks.com/2013/10/25/sort-Chinese-characters-in-cpp/ 采用locate.注意事项:排序的名字,如果出现某一个人,出现在顶上 ...
- MySQL实现中文拼音排序
MySQL下新建一个表,默认采用utf8字符集,中文不能直接按照拼音进行排序. 例如以下语句: SELECT * FROM `tb_fixedassets` order by C_FANAME 得到的 ...
- javascript 汉字拼音排序
定义和用法 用本地特定的顺序来比较两个字符串. 语法 stringObject.localeCompare(target) 参数 描述 target 要以本地特定的顺序与 stringObject 进 ...
- MySQL按中文拼音排序
好多时候,我们希望查询出来的记录能够按照汉语拼音即英文的26个字母排序,但是utf字符集是外国人弄的,不是按照汉语拼音的顺序排列的,因此,我们需要将要排序的字段把编码设定为GBK或者BG2312再进行 ...
- sql按照中文拼音排序
select * from table order by convert(columnName using gbk) asc 注意:会导致全表扫描 建立冗余字段,插入数据时字段为convert(col ...
- Java中中文拼音的排序问题
最近做一个手机数据同步的应用开发,需要提供地址簿信息按照姓名的拼音次序进行排序.但仔细考察Java提供的Collator之后,发现其中文拼音排序存在严重的问题.Java提供Collator来支持不同语 ...
- 使mysql按中文字段排序
http://ourmysql.com/archives/391 测试后我发现,gbk不仅对字符内容是按拼音排序的,对数字也是一样,使用时需注意! 另外一篇文章: MySQL按中文拼音排序
随机推荐
- P3243 [HNOI2015]菜肴制作
传送门 把时间看成数,菜肴看成位置 考虑一个位置填什么数很麻烦 考虑一个数放在什么位置 一开始我想的是,对于一个限制 $(a,b)$ ,从 $a$ 往 $b$ 连一条边,然后如果有解则所有的限制构成了 ...
- P3233 [HNOI2014]世界树
传送门 看到指定的总节点数小于等于 300000 就知道要搞虚树了 考虑如何在虚树确定每个议事处控制的节点数量 可以两遍dfs 第一遍求儿子对父亲的影响,第二遍求父亲对儿子影响 注意搜索顺序,这样就可 ...
- VBS映射网络驱动器 映射网络驱动器
Dim objNetwork Set objNetwork = CreateObject("Wscript.Network") if objNetwork.EnumNetworkD ...
- VBS虚拟键盘十六进制列表
Set WshShell=WScript.CreateObject("WScript.Shell") '打开我的电脑WshShell.Sendkeys chr(&h88b6 ...
- linux驱动之设备模型
linux 设备驱动模型 inux2.6提供了新的设备模型:总线.驱动.设备.基本关系简要的概括如下: 驱动核心可以注册多种类型的总线. 每种总线下面可以挂载许多设备.(通过kset devices) ...
- 分享个高精度IP定位
https://www.opengps.cn/Data/IP/LocHighAcc.aspx
- jenkins显示发送邮件发送成功但是邮箱没收到
jenkins显示发送邮件发送成功但是邮箱没收到 解决方案: 重新配置一下系统管理-系统设置-Extended E-mail Notification
- PIE SDK矢量数据的读取
1.功能简介 GIS将地理空间数据表示为矢量数据和栅格数据.矢量数据模型使用点.线和多边形来表示具有清晰空间位置和边界的空间要素,如控制点.河流和宗地等,每个要素被赋予一个ID,以便与其属性相关联.栅 ...
- 转 AIX7.2+11.2.0.4RAC实施
参考 https://blog.csdn.net/alangmei/article/details/18310381 https://blog.csdn.net/smasegain/article/d ...
- rancher 2.X 搭建小型web集群+mysql主从复制
一,环境配置 rancher 2.1.6 二,配置harbor私有仓库 见上文 三,配置私有镜像 01,总文件 dockerfile 为主配置文件,html 为站点文件wordpress.,官网 ...