SQLAlchemy usando load_only con distinto

Estoy tratando de usar la función distinta con SQLAlchemy pero no parece funcionar. Preparé un pequeño ejemplo donde puedes ver mi problema:

#-*- coding: utf-8 -*- from sqlalchemy import create_engine,Column, Integer from sqlalchemy.orm import sessionmaker,load_only from sqlalchemy.ext.declarative import declarative_base engine = create_engine('sqlite:///:memory:') Session = sessionmaker(bind=engine) session = Session() Base = declarative_base() class my_class(Base): __tablename__ = 'my_table' id= Column(Integer, primary_key=True) data= Column(Integer) Base.metadata.create_all(engine) for i in range(10): p=my_class() p.id=i p.data=55 session.add(p) session.commit() s=session.query(my_class).distinct(my_class.data).options(load_only(my_class.data)) print (s) for a in s.all(): print (a.id,a.data) 

Ejecutando esto esperaría una salida como esta:

 SELECT my_table.data AS my_table_data FROM my_table None 55 

Pero en cambio estoy recibiendo esto:

 SELECT DISTINCT my_table.id AS my_table_id, my_table.data AS my_table_data FROM my_table 0 55 1 55 2 55 3 55 4 55 5 55 6 55 7 55 8 55 9 55 

¿Qué estoy haciendo mal?

Aplazar la clave principal no tendría sentido, si se consultan entidades ORM completas, porque una entidad debe tener una identidad para que se pueda identificar una fila única en la tabla de la base de datos . Por lo tanto, la consulta incluye la clave principal aunque tenga su load_only() . Si solo desea los datos, debe consultarlos específicamente:

 In [12]: session.query(my_class.data).distinct().all() 2017-06-30 12:31:49,200 INFO sqlalchemy.engine.base.Engine SELECT DISTINCT my_table.data AS my_table_data FROM my_table 2017-06-30 12:31:49,200 INFO sqlalchemy.engine.base.Engine () Out[12]: [(55)] 

De hecho, hubo un problema por el que load_only() eliminó la clave principal de la lista de selección y se solucionó en 0.9.5 :

[orm] [error] Se modificó el comportamiento de orm.load_only() modo que las columnas de clave primaria siempre se agregan a la lista de columnas para que se “no aplacen”; de lo contrario, el ORM no puede cargar la identidad de la fila. Aparentemente, uno puede diferir las claves primarias asignadas y el ORM fallará, eso no se ha cambiado. Pero como load_only esencialmente dice “aplazar todo menos X”, es más crítico que los grupos de PK no sean parte de este aplazamiento.