由相同的select distinct查询返回的键控元组对象,但创建方式不同,即使结果相同,也完全不同。
以下是演示此错误的示例:
import sqlalchemy as sa
from sqlalchemy.orm import (sessionmaker, scoped_session,)
from sqlalchemy.ext.declarative import (declarative_base,)
Base = declarative_base()
db_uri = 'sqlite:///test.db'
engine = sa.create_engine(db_uri, echo=True)
class Test(Base):
__tablename__ = 'test'
id = sa.Column(sa.Integer, primary_key=True)
field2 = sa.Column(sa.Integer)
Base.metadata.create_all(bind=engine)
def main():
Session = scoped_session(sessionmaker(bind=engine))
session = Session()
session.add_all([Test(field2=i) for i in xrange(10)])
session.add_all([Test(field2=i) for i in xrange(10)])
session.commit()
q1 = session.query(Test.field2).distinct().all()
q2 = session.query(sa.distinct(Test.field2)).all()
# print the results
print 'Q1 results :' , ' -- ', [i for i in q1]
print 'Q2 results :' , ' -- ', [i for i in q2]
# print the keyed tuple dictionary
print 'Q1 as_dict :', [i._asdict() for i in q1]
print 'Q2 as_dict :', [i._asdict() for i in q2]
这两个查询返回与第一对打印
所示完全相同的结果然而,obj._as_dict()值是不同的;为第一个查询填充,为第二个查询清空。
这是正常的吗?我错过了什么?
的问候,
答案 0 :(得分:1)
简短回答是,您的q2
会丢失该字段的name
,而_asdict()
仅返回指定列的值。添加label
将解决它:
q2 = session.query(sa.distinct(Test.field2).label('field2')).all()