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í