使用 peewee 进行不区分大小写的排序

ste*_*nci 2 python sqlite peewee

以下排序区分大小写:

MyModel.select().order_by(MyModel.name)
<class '__main__.MyModel'> SELECT t1."id", t1."name" FROM "mymodel" AS t1 ORDER BY t1."name" []
Run Code Online (Sandbox Code Playgroud)

如何添加 aNOCASE使其不区分大小写?

或者有没有其他方法可以让它不区分大小写?

我在文档上找不到任何关于它的信息。

Mar*_*ers 5

您可以使用 SQL 函数(带有fnhelper)来小写模型名称:

MyModel.select().order_by(fn.Lower(MyModel.name)) 
Run Code Online (Sandbox Code Playgroud)

对于 SQLite,您也应该能够使用自定义排序规则:

@db.collation()
def collate_case_insensitive(s1, s2):
    return cmp(s1.lower(), s2.lower())
Run Code Online (Sandbox Code Playgroud)

子类@db.collation()提供的装饰器允许您注册自定义排序规则函数,然后您可以使用该函数进行排序:SqliteExtDatabase()

MyModel.select().order_by(collate_case_insensitive.collation(MyModel.name))
Run Code Online (Sandbox Code Playgroud)

当然,SQLite 已经有一个内置的NOCASE排序规则,应该在这里使用,但是要使用它必须构建一个SQL()对象来包含原始 SQL:

MyModel.select().order_by(Clause(MyModel.name, SQL('collate NOCASE')))
Run Code Online (Sandbox Code Playgroud)

这与 SQLAlchemy 不区分大小写排序的工作原理相呼应:SQL alchemy case insensitive sort order