在peewee查询上使用COLLATE

时间:2014-11-20 22:43:22

标签: sqlite collation peewee

我在peewee文档how to create custom collations中找到了,但我无法找到如何使用the built-in sqlite collating sequences

何我在peewee中创建以下查询(它是上面提到的sqlite文档页面中的最后一个)?

SELECT x FROM t1 ORDER BY c COLLATE NOCASE, x;

如何指定索引的排序规则?

CREATE INDEX i1 ON t1(f1 COLLATE NOCASE);

修改

coleifer的回答解决了有关查询的问题。

对于索引创建,我使用以下技巧,当你在启动时只创建一次索引时就好了(就像在我的应用程序中一样)。

LockedFiles上两列的不区分大小写的唯一索引可以防止重复的条目。

class LockedFiles(PeeweeModel):
    folder = peewee.CharField(index=True)
    file   = peewee.CharField(index=True)

    @classmethod
    def custom_init(cls):
        db.execute_sql('create unique index if not exists lockedfiles_unique '
                       'on lockedfiles(folder collate nocase, file collate nocase)', {})

def create_tables(drop_existing_tables):

    for table in [LockedFiles, Model2, Model3]:

        if drop_existing_tables:
            table.drop_table(True)

        table.create_table(True)

        try:
            table.custom_init()
        except:
            pass

create_tables(drop_existing_tables=False)

1 个答案:

答案 0 :(得分:1)

您可以通过构建SQL子句并将其传递给order_by()来指定排序规则。

例如:

collated = Clause(MyModel.field, SQL('COLLATE NOCASE'))
MyModel.select().order_by(collated, MyModel.other_field)

对于索引,遗憾的是,您需要手动创建,因为peewee不知道如何将归类信息添加到CREATE INDEX SQL中。如果您想打开拉取请求,我肯定会考虑合并该功能。