Re: Codificación de caracteres en SQLAlchemy

Chema Cortes pych3m4 en gmail.com
Lun Ago 18 16:40:00 CEST 2008


El día 14 de agosto de 2008 20:35, Alberto Valverde
<alberto en toscat.net> escribió:

> Creo que es porque SQLAlchemy, de primeras, no sabe (ni debe intentar
> adivinar, IMHO) si una columna de texto cargada con autoload contiene
> texto codificado o no así que las refleja todas como sa.types.String.
> Para decirle que quieres que te las decodifique al salir de la bd y
> codifique al entrar (usando el codec que especificas en 'encoding' como
> de/codificador) tienes que declarar las columnas explicitamente como
> sa.types.Unicode.
>
> Si usas autoload puedes configurar el engine con 'convert_unicode' para
> que todas las columnas de texto las refleje como sa.typesUnicode.
> Recuerda que una vez que hagas ésto le debes pasar siempre unicode a
> esas columnas o SA dará warnings. En una próxima versión dará error ya
> que decodificar a ciegas  un str es una bomba de relojería ;)
>
> Más info aquí:
> http://www.sqlalchemy.org/docs/05/dbengine.html#dbengine_options

Mi consulta iba más encaminada a los nombres de columnas y tablas
(metadata) que a la codificación del contenido en sí.

Ahora que he tomado algo más de soltura con SA, veo dónde tenía mis
dificultades: SQLAlchemy usa internamente unicode, por defecto
codificado desde utf8. Los argumentos del create_engine tales como
"encoding" se refieren más a cómo transformar al "unicode" que usa SA,
que puede no tener ninguna relación con la codificación empleada en la
conexión con el servidor de datos.

Dicho de otro modo, SQLAlchemy realiza internamente la conversión
entre codificaciones en vez de delegar en el motor de base de datos,
algo que resulta lógico cuando hay motores, como sqlite y msaccess,
que no realizan esta labor. De la pruebas que he hecho, con sqlite y
postgres no hay problema (postgres convierte codificaciones entre
cliente y servidor, y sqlite pasa de todo (lo que a veces representa
una ventaja en vez de un defecto)); pero con mysql me temo que hace
falta entrar a tocar el objeto conexión[1].

De todos modos, no parece ser un problema de SQLAlchemy; tal vez
podría ser una mejora el poder controlar mejor las codificaciones de
las conexiones.




[1] Como decía, el problema con mysql no tiene relación con SA. Estoy
obteniendo un error de sintaxis al intentar crear tablas con nombres
codificados en unicode (utf8), por ejemplo u"create table '\u880e'", y
que podría ser un problema de MySQLdb ¿?
_______________________________________________
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