[pyar] Convirtiendo tipos automáticamente en SQLAlchemy

Jan Gallardo jmgr en outlook.cl
Mie Oct 30 15:14:38 -03 2019


________________________________
De: pyar <pyar-bounces en python.org.ar> en nombre de Matías Bellone <matiasbellone en gmail.com>
Enviado: miércoles, 30 de octubre de 2019 18:01
Para: Python Argentina <pyar en python.org.ar>
Asunto: Re: [pyar] Convirtiendo tipos automáticamente en SQLAlchemy

On Wed, Oct 30, 2019 at 2:00 PM Facundo Batista <facundobatista en gmail.com<mailto: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<https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Flinkode.org%2F%23bsx6ipDDTzUACHRG6lW8C4&data=02%7C01%7C%7C3caa20474e234ee5a66b08d75d633b73%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637080553092964967&sdata=dpCIA7dhqyg84IjNPYX4C0MiaVdOw6VU8eCvTyCVg68%3D&reserved=0>


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<https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.sqlalchemy.org%2Fen%2F13%2Form%2Fsession_api.html%23sqlalchemy.orm.session.Session.execute&data=02%7C01%7C%7C3caa20474e234ee5a66b08d75d633b73%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637080553092974978&sdata=Fi6M7fkejAJLgh8UVlB2ZG1z0I9HlpLwbzwC4ub%2BDbI%3D&reserved=0>
[2] https://docs.sqlalchemy.org/en/13/core/sqlelement.html#sqlalchemy.sql.expression.text<https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.sqlalchemy.org%2Fen%2F13%2Fcore%2Fsqlelement.html%23sqlalchemy.sql.expression.text&data=02%7C01%7C%7C3caa20474e234ee5a66b08d75d633b73%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637080553092984984&sdata=8XswLSejwxc8Kqtu3OTCZx3NWWjZycq9NBLNPLYCa%2FA%3D&reserved=0>
[3] https://docs.sqlalchemy.org/en/13/core/sqlelement.html#sqlalchemy.sql.expression.TextClause.columns<https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.sqlalchemy.org%2Fen%2F13%2Fcore%2Fsqlelement.html%23sqlalchemy.sql.expression.TextClause.columns&data=02%7C01%7C%7C3caa20474e234ee5a66b08d75d633b73%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637080553092994995&sdata=ncD0zaSEOqIs9v6KB9HW36yEJcuLdw6rVhN6YDruxQk%3D&reserved=0>
[4] https://docs.sqlalchemy.org/en/13/core/connections.html#schema-translating<https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdocs.sqlalchemy.org%2Fen%2F13%2Fcore%2Fconnections.html%23schema-translating&data=02%7C01%7C%7C3caa20474e234ee5a66b08d75d633b73%7C84df9e7fe9f640afb435aaaaaaaaaaaa%7C1%7C0%7C637080553093005000&sdata=xtk%2FyhdeF90DGFCrswArTKhtqNY07NZPWQjTxXQkNKE%3D&reserved=0>

______________________________


Yo probé con

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

Y funciona

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20191030/8d0cced7/attachment.html>


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