Codificación de caracteres en SQLAlchemy

Alberto Valverde alberto en toscat.net
Jue Ago 14 20:35:36 CEST 2008


Chema Cortes wrote:
> Estoy empezando con SQLAlchemy, así que puede que mi problema sea algo tonto...
>
> Pretendo pasar una tabla de una base de datos MsAccess a Postgresql,
> adaptando el MetaData de un motor al otro. Como la tabla original
> utiliza la codificación cp1252 en los nombres de tablas y campos, se
> lo indico en el parámetro "encoding"; la base de datos destino tiene
> codificación "utf8":
>
> #-*- encoding: utf8 -*-
>
> db_access=create_engine("access:///j:/work/deu/crc.mdb",encoding="cp1252")
> m1=MetaData(db_access)
>
> db_pg=create_engine("postgres://chema:pw@skynet:5432/chema",encoding="utf-8")
> m2=MetaData(db_pg)
>
> t1=Table(u"Conexión",m1, autoload=True)
> t2=t1.tometadata(m2)
> t2.drop(checkfirst=True)
> t2.create()
>
>
> El primer metadata, m1, funciona correctamente, pero al adaptarlo al
> segundo parece como si "recodificara" dos veces a utf8. Veo mal los
> nombres de tabla y campos, "Conexión" en lugar de "Conexión".
>
> print type(t1.description),t1.description  --> <type 'str'> Conexi\xf3n
> print type(t2.description),t2.description  --> <type 'str'> Conexi\xf3n
>
>
> Los dos metadatas están codificados en cp1252 como strings. Si el
> segundo motor pongo encoding="cp1252" entonces me pone los nombres
> bien.
>
> Preguntas:
>
> 1) ¿Por qué no se adapta el metadata origen según la codificación del
> metadata destino?
>   
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

Alberto
_______________________________________________
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