python - 如何构建一个按照 PostgreSQL 的方式对字符串进行排序的 Python 比较器?

标签 python postgresql collation

这个问题本质上和this question是一样的, Python 除外。

我希望从按电子邮件地址列排序的 PostgreSQL 数据库中查询行,然后在依赖于该排序的 Python 中执行操作。

我正在查询的数据库使用的是 en_US.UTF8 排序规则,通过一些测试,我发现它对于 @ 有一些特殊的行为电子邮件地址中的符号:

mydb=> SELECT '0'  < '@';
 ?column? 
----------
 f
(1 row)

mydb=> SELECT '0'  < '@0';
 ?column? 
----------
 t
(1 row)

This answer建议某些排序规则可能会忽略 @ 符号,但如果是这种情况,我会期望第二个查询出现 t

尽管 Python 提供了一个 locale module , 该模块有 inconsistent behavior on some platforms ,所以我似乎无法为此目的使用该模块。

根据该报告,我尝试了使用 PyICU package 的建议, 这看起来很有希望:

>>> import icu
>>> collator = icu.Collator.createInstance()
>>> collator.getLocale()
<Locale: en_US>
>>> collator.getSortKey('0') < collator.getSortKey('@')
False
>>> collator.getSortKey('0') < collator.getSortKey('@0')
False

但如您所见,在上次比较中,它产生的顺序与 postgres 不同。

我尝试为查询指定不同的排序规则,例如:

SELECT email COLLATE posix FROM mytable ORDER by email;

但这会导致错误:编码“UTF8”的排序规则“posix”不存在。我还尝试了 "en-us-x-icu" 的整理,但也不存在。

有没有什么方法可以按照 Python 程序可以依赖的顺序从 PostgreSQL 中可靠地查询一列电子邮件地址,要么通过调整查询的排序规则,要么通过遵循 Python 中的默认排序规则?

最佳答案

在 Postgres 中使用 collat​​e "C":

with test(test) as (
values ('@'), ('@0'), ('0')
)

select test
from test
order by test collate "C"

 test 
------
 0
 @
 @0
(3 rows)

python :

>>> test = ['@', '@0', '0']
>>> test.sort()
>>> test
['0', '@', '@0']    

关于python - 如何构建一个按照 PostgreSQL 的方式对字符串进行排序的 Python 比较器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54063782/

相关文章:

python - 以 32 位模式运行 OS X 通用二进制文件

mysql - OODBMS postgreSQL array 字段的实际用途?

java - JPA - 从计算列设置实体类属性?

python - celery :事件==信号?

python - 如何将数组转换为模型输入?

python - 无法使用python在sqlite3中创建数据库

postgresql - Postgresql 9.1 中的正确整理

MySQL 仅在插入或唯一键上更改排序规则

python - 如何计算列表中唯一值的出现次数

php 正则表达式匹配类似于字母。又名 u=ü 或 ê=é=è=e