você pode conseguir uma insensível restrição caso 'único' em Sqlite3 (com Django)?

votos
11

Então, digamos que eu estou usando o Python 2.5 embutido no sqlite3 padrão e eu tenho uma classe de modelo Django com o seguinte código:

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

Eu tenho a configuração do interface de administração e tudo parece estar funcionando bem, exceto que eu posso criar dois registros SomeEntity, um com some_field = 'algum valor' e um com some_field = 'algum valor', porque a restrição exclusiva em some_field parece ser maiúsculas e minúsculas.

Existe alguma maneira de forçar o SQLite para executar um caso em comparação sensível ao verificar singularidade?

Eu não consigo encontrar uma opção para isso no docs do Django e eu estou querendo saber se há algo que eu possa fazer diretamente para SQLite para obtê-lo a se comportar da maneira que eu quero. :-)

Publicado 10/11/2008 em 00:20
fonte usuário
Em outras línguas...                            


2 respostas

votos
8

Sim isso pode ser feito facilmente, adicionando um índice exclusivo para a tabela com o seguinte comando:

Criar original ÍNDICE NO uidxName minhatabela (myfield AGRUPAR NOCASE)

Se você precisar de caso insensibilidade para letras nonASCII, você precisará registrar o seu próprio COLLATION com comandos semelhantes ao seguinte:

O exemplo a seguir mostra um agrupamento personalizado que classifica “o caminho errado”:

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()

Documentação python adicional para sqlite3 mostrados aqui

Respondeu 22/01/2009 em 23:18
fonte usuário

votos
3

Talvez você pode criar e usar um campo de modelo personalizado; seria uma subclasse de CharField mas fornecendo uma db_type método retornando "NOCASE texto agrupar"

Respondeu 10/11/2008 em 01:00
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more