2014-10-02 35 views
2

即使結果相同,由同一個選擇不同查詢返回但創建方式不同的鍵控元組對象完全不同。Sqlalchemy鍵控元組錯誤與選擇不同

下面是一個例子證明在這種錯誤:

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] 

這些2個查詢作爲由所述第一對打印所示

然而返回完全相同的結果,該obj._as_dict()值是不同的;爲第一個查詢填充,第二個爲空。

這是正常的嗎?我錯過了什麼?

問候,

回答

1

簡短的回答是,你q2失去領域的name,而_asdict()返回值只爲命名的列。添加label將解決它:

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