[pyar] Convirtiendo tipos automáticamente en SQLAlchemy

Matías Bellone matiasbellone en gmail.com
Mie Oct 30 15:01:02 -03 2019


On Wed, Oct 30, 2019 at 2:00 PM Facundo Batista <facundobatista en gmail.com>
wrote:

> Hola!
>
> No estoy encontrando cómo convertir tipos automáticamente cuando
> accesedo por la capa de core.
>
> En otras palabras, no logro hacer que funque el último assert de este
> script:
>
>     http://linkode.org/#bsx6ipDDTzUACHRG6lW8C4
>
>
Para contexto, lo que estás haciendo es:

row = session.execute("select test_enum from test;").fetchone()


Según la documentación del execute de SQLAlchemy[1], eso es equivalente a
hacer lo siguiente

query = text("select test_enum from test;")
row = session.execute(query).fetchone()


La documentación de text[2] por su parte, dice que:

"The advantages text() provides over a plain string are backend-neutral
> support for bind parameters, per-statement execution options, as well as
> bind parameter and result-column typing behavior, allowing SQLAlchemy type
> constructs to play a role when executing a statement that is specified
> literally."


Para mí eso quiere decir que para soportar que una query textual devuelva
los tipos correctos, tenés que indicárselo a mano utilizando el método
columns[3]. Lo que es más, la documentación de la traducción de esquemas a
tipos de datos[4] dice clarito que:

"The Connection.execution_options.schema_translate_map parameter affects
> all DDL and SQL constructs generated from the SQL expression language, as
> derived from the Table or Sequence objects. It does not impact literal
> string SQL used via the expression.text() construct nor via plain strings
> passed to Connection.execute()."


Así que evidentemente si vas a ejecutar queries en texto, tenés que hacer
la traducción a mano.

Habiendo dicho todo esto, lamentablemente mis pruebas del siguiente pedazo
de código no anduvieron :(

query = text("select test_enum from test;").columns(test_enum=MyWeirdType)
row = session.execute(query).fetchone()


Espero que eso al menos te de una idea de para dónde seguir o alguien más
pueda darte el empujón que faltaba

[1]
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.execute
[2]
https://docs.sqlalchemy.org/en/13/core/sqlelement.html#sqlalchemy.sql.expression.text
[3]
https://docs.sqlalchemy.org/en/13/core/sqlelement.html#sqlalchemy.sql.expression.TextClause.columns
[4]
https://docs.sqlalchemy.org/en/13/core/connections.html#schema-translating
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20191030/7a70c376/attachment.html>


Más información sobre la lista de distribución pyar