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

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

Чтобы избежать дублирования ответов, может быть, этот ответ может направить вас на правильный путь?

LaundroMat 24.06.2011 20:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
12
1
4 336
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Интересно, но COLLATE NOCASE обеспечивает нечувствительность к регистру только для букв ASCII. Неважно, я использую sqlite только для прототипа, а не для конечного продукта. Спасибо за предложение.

Curtis Batt 10.11.2008 08:15
Ответ принят как подходящий

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

СОЗДАТЬ УНИКАЛЬНЫЙ ИНДЕКС 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 здесь

Другие вопросы по теме