python - 选择不同的 SQLalchemy 键控元组错误

标签 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]

这 2 个查询返回与第一对打印结果完全相同的结果

但是,obj._as_dict() 的值是不同的;为第一个查询填充,为第二个查询填充为空。

这正常吗?我是不是漏了什么?

问候,

最佳答案

简短的回答是您的 q2 丢失了字段的 name,而 _asdict() 仅为命名列返回值。添加 label 将解决它:

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

关于python - 选择不同的 SQLalchemy 键控元组错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26160568/

相关文章:

python - 设置 SQLAlchemy 自动增量起始值

python - SQLAlchemy "excluded"插入中的 PostgreSQL 命名空间...冲突

python - 在数据框中添加随机噪声

python - pytorch 中的列选择是可微分的吗?

sql - 日期时间上的 "BETWEEN AND"和 "> AND <="有什么区别?

mysql - 如何在一个字段中查找重复项而在另一个字段中不重复

python - 如何使用正则表达式和 lambda 表达式更改 DataFrame 列 dtype?

python - pandas -- 删除包含 nans 的行 -- 忽略列

php - SQL 按 ID 列表过滤

sqlalchemy - 在查询中查找 Table 对象