tutorial python django sqlite django-models

python - tutorial - django mysql



¿Se puede lograr una restricción "única" insensible a mayúsculas y minúsculas en Sqlite3(con Django)? (2)

Entonces, digamos que estoy usando el sqlite3 predeterminado incorporado de Python 2.5 y tengo una clase de modelo Django con el siguiente código:

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

Tengo la configuración de interfaz de administrador y todo parece funcionar bien, excepto que puedo crear dos registros SomeEntity, uno con some_field = ''some value'' y otro con some_field = ''Some Value'' porque la restricción única en some_field parece ser distingue mayúsculas y minúsculas.

¿Hay alguna forma de forzar a sqlite a realizar un caso en comparación sensible cuando se comprueba la exclusividad?

Parece que no puedo encontrar una opción para esto en los documentos de Django y me pregunto si hay algo que pueda hacer directamente con sqlite para que se comporte de la manera que quiero. :-)


Tal vez pueda crear y usar un campo de modelo personalizado; sería una subclase de CharField, pero proporcionaría un método db_type que devolvería "texto clasificado nocase"


Sí, esto se puede hacer fácilmente agregando un índice único a la tabla con el siguiente comando:

CREAR UN ÍNDICE ÚNICO uidxName EN mytable (myfield COLLATE NOCASE)

Si necesita insensibilidad de mayúsculas y minúsculas para letras que no sean de ASCII, deberá registrar su propia COLLATION con comandos similares a los siguientes:

El siguiente ejemplo muestra una intercalación personalizada que ordena "de la manera incorrecta":

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

Documentación adicional de python para sqlite3 que se muestra aquí