Можете ли вы достигнуть нечувствительного к регистру «уникального» ограничения в Sqlite3 (с Django)? - PullRequest
12 голосов
/ 10 ноября 2008

Допустим, я использую встроенный в Python 2.5 sqlite3 по умолчанию и у меня есть класс модели Django со следующим кодом:

class SomeEntity(models.Model):
    some_field = models.CharField(max_length=50, db_index=True, unique=True)

У меня есть настройка интерфейса администратора, и все, кажется, работает нормально, за исключением того, что я могу создать две записи SomeEntity, одну с some_field = 'some value' и одну с some_field = 'Some Value', потому что уникальное ограничение для some_field представляется чувствительным к регистру.

Есть ли способ заставить sqlite выполнить регистр в чувствительном сравнении при проверке уникальности?

Мне кажется, я не могу найти вариант для этого в документации Django, и мне интересно, могу ли я что-то сделать напрямую с sqlite, чтобы заставить его вести себя так, как я хочу. : -)

Ответы [ 2 ]

9 голосов
/ 23 января 2009

Да, это легко сделать, добавив уникальный индекс в таблицу с помощью следующей команды:

СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС uidxName ON mytable (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()

Показана дополнительная документация по Python для sqlite3 здесь

3 голосов
/ 10 ноября 2008

Возможно, вы сможете создать и использовать настраиваемое поле модели; это был бы подкласс CharField, но предоставляющий метод db_type , возвращающий "text collate nocase"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...