Forzar en sqlite afinidad text para Decimal
Oswaldo Hernández
listas en soft-com.es
Lun Mayo 12 23:26:24 CEST 2008
Chema Cortes escribió:
> Quisiera completar los conversores y adaptadores que vienen con
> sqlite3 para añadir algunos tipos python más. Uno de los más
> interesantes es el tipo "Decimal", definido así:
>
> sqlite3.register_converter("decimal",lambda s:decimal.Decimal(s))
> sqlite3.register_adapter(Decimal,lambda x:str(x))
>
>
> que consistiría en convertir el tipo decimal a texto antes de
> guardarlo en la tabla. El problema es que, implícitamente, sqlite
> aplica una "afinidad" de datos "numeric" y prueba a convertir el dato
> a número antes del almacenamiento efectivo, perdiéndose toda la
> precisión del tipo decimal.
>
> Necesito forzar la afinidad "text" (o que no use ninguna) para que
> guarde el dato tal cual. Se me ocurren dos cosas:
>
> - que el adaptador devuelva una cadena que sea imposible convertir a
> número (eg: añadiendo caracteres no numéricos)
> - que el tipo del campo tenga añadido la palabra "text"
>
> No tengo demasiada experiencia con sqlite, por lo que no sé si existe
> algún modo mejor de forzar la afinidad de datos. De entre estas dos
> opciones, creo que la última es la más "elegante", aunque también es
> la más fácil de cometer errores al olvidar de añadir la partícula
> "text".
>
> ¿Alguna recomendación sobre forzar afinidades, teniendo en cuenta que
> también quisiera añadir funciones de agregación que trabajen con
> decimales?
>
>
Hola Chema,
He estado probando el codigo que envias y la cosa pinta bastante chunga.
La primera solución que dices funciona bien, pero perderas la portabilidad de los datos.
Creo que la mejor solución es la segunda aunque haya que epecificar 'text'.
Otra opcion que tienes es olvidarte del converter y utilizar solo el adaptador declarando la columna
como tipo 'text' y haciendo el cast en el select.
Saludos,
--
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
PD:
Antes de imprimir este mensaje, asegúrese de que es necesario.
El medio ambiente está en nuestra mano.
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es