这个问题本质上和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 中使用 collate "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/