你能在Sqlite3(使用Django)中实现不区分大小写的"唯一"约束吗?

Cur*_*att 12 python sqlite django django-models

所以,假设我使用Python 2.5的内置默认sqlite3,我有一个Django模型类,代码如下:

class SomeEntity(models.Model):
    some_field = models.CharField(max_length=50, db_index=True, unique=True)
Run Code Online (Sandbox Code Playgroud)

我有管理界面设置,一切似乎工作正常,除了我可以创建两个SomeEntity记录,一个some_field ='some value'和一个some_field ='Some Value'因为some_field上的唯一约束似乎是区分大小写.

在检查唯一性时,是否有某种方法可以强制sqlite 敏感比较中执行一个案例?

我似乎无法在Django的文档中找到一个选项,我想知道是否有一些我可以直接对sqlite做的事情让它按照我想要的方式运行.:-)

Noa*_*oah 9

是的,这可以通过使用以下命令向表中添加唯一索引来轻松完成:

在mytable上创建UNIQUE INDEX uidxName(myfield COLLATE NOCASE)

如果您需要对非ASCII字母不区分大小写,则需要使用与以下内容类似的命令注册您自己的COLLATION:

以下示例显示了对"错误方式"进行排序的自定义排序规则:

import sqlite3

def collate_reverse(string1, string2):
    return -cmp(string1, string2)

con = sqlite3.connect(":memory:")
con.create_collation("reverse", collate_reverse)

cur = con.cursor()
cur.execute("create table test(x)")
cur.executemany("insert into test(x) values (?)", [("a",), ("b",)])
cur.execute("select x from test order by x collate reverse")
for row in cur:
    print row
con.close()
Run Code Online (Sandbox Code Playgroud)

此处显示了sqlite3的其他python文档