Sqlalchemy使用select distinct键入元组错误

时间:2014-10-02 12:14:56

标签: python sql sqlalchemy

由相同的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()值是不同的;为第一个查询填充,为第二个查询清空。

这是正常的吗?我错过了什么?

的问候,

1 个答案:

答案 0 :(得分:1)

简短回答是,您的q2会丢失该字段的name,而_asdict()仅返回指定列的值。添加label将解决它:

q2 = session.query(sa.distinct(Test.field2).label('field2')).all()