Допустим, я использую встроенный в 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 выполнять сравнение вsensitive при проверке уникальности?
Кажется, я не могу найти вариант для этого в документах Django, и мне интересно, есть ли что-то, что я могу сделать непосредственно с sqlite, чтобы заставить его вести себя так, как я хочу. :-)






Возможно, вы сможете создать и использовать настраиваемое поле модели; это был бы подкласс CharField, но предоставляющий метод db_type, возвращающий "text collate nocase"
Интересно, но COLLATE NOCASE обеспечивает нечувствительность к регистру только для букв ASCII. Неважно, я использую sqlite только для прототипа, а не для конечного продукта. Спасибо за предложение.
Да, это легко сделать, добавив уникальный индекс в таблицу с помощью следующей команды:
СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС uidxName НА 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 здесь
Чтобы избежать дублирования ответов, может быть, этот ответ может направить вас на правильный путь?