воскресенье, 12 сентября 2021 г.

Disable automatic labels/aliases in sqlalchemy ORM query

 Usually sqlalchemy ORM query always uses labels for colmns in queries. For example

select data from table

becomes 

select data as table_data from table

Usually this behavior is fine. But in case if needed it can disabled by subclassing and modifying Query class

sqlalchemy 1.3

from sqlalchemy.orm import Query

class QueryNoLabels(Query):
    def __iter__(self):
        """Patch to disable auto labels"""
        context = self._compile_context(labels=False)
        context.statement.use_labels = False
        if self._autoflush and not self._populate_existing:
            self.session._autoflush()
        return self._execute_and_instances(context)
session_cls = sessionmaker(bind=engine, query_cls=QueryNoLabels)
session = session_cls()
session.query() 

One such case is bug in databricks see this SO post.
Reference: 
https://stackoverflow.com/questions/55754209/why-does-sqlalchemy-label-columns-in-query/69151444#69151444 

sqlalchemy 1.4

class QueryNoLabels(Query):

_label_style = LABEL_STYLE_NONE
session_cls = sessionmaker(bind=engine, query_cls=MyQuery)
session = session_cls()
session.query()