SQLAlchemy 子查询列表对象没有属性

Posted

技术标签:

【中文标题】SQLAlchemy 子查询列表对象没有属性【英文标题】:SQLAlchemy Subquery List Object has no Attribute 【发布时间】:2018-11-26 12:05:57 【问题描述】:

喂?我正在尝试在 SQLAlchemy 中编写一个查询(有 2 个子查询),但出现错误 AttributeError: 'list' object has no attribute 'l_date'

这是我的代码:

import sqlalchemy as db
from sqlalchemy import func
from sqlalchemy import desc
from sqlalchemy.orm import sessionmaker
from sqlalchemy import or_
from sqlalchemy import and_
from sqlalchemy.sql.expression import  alias

try:

    engine = db.create_engine('postgresql://user:pass@localhost:5432/db_name')
    connection = engine.connect()

except:
    print('Error establishing DB connection')

# Import metadata
metadata = db.MetaData()

# create a configured "Session" class
Session = sessionmaker(bind=engine)

# create a Session
session = Session()

# Import articles, authors and log tables
log = db.Table('log', metadata, autoload=True, autoload_with=engine)


def days_with_request_errors():
    query1 = db.select([func.DATE(log.columns.time).label('l_date'), func.count(log.columns.status).label('s_count')]) \
        .where(or_(log.columns.status.like('%5%'), log.columns.status.like('%4%'))) \
        .group_by(func.DATE(log.columns.time))

    ResultProxy = connection.execute(query1)
    q1 = ResultProxy.fetchall()

    query2 = db.select([func.DATE(log.columns.time).label('l_date'),
                          func.count(log.columns.status).label('s_count')]) \
        .group_by(func.DATE(log.columns.time))

    ResultProxy = connection.execute(query2)
    q2 = ResultProxy.fetchall()

    main_query = db.select([q1.l_date, (q1.s_count * 100) / q2.s_count]) \
        .where(q1.l_date == q2.l_date) \
        .where(and_((q1.c.s_count * 100) / q2.c.s_count) > 1)

    ResultProxy = connection.execute(main_query)
    return ResultProxy.fetchall()

这是我转移到 SQLAlchemy 的原始 SQL 查询。 (原始查询工作正常):

SELECT q1.date, ((q1.count * 100) / q2.count) as percentage
  FROM (SELECT date(time) as date, COUNT(status) as count
        FROM log
        WHERE status LIKE '%4%' or status LIKE '%5%'
        GROUP BY date(time)) as q1,
       (SELECT date(time) as date, COUNT(status) as count
        FROM log
        GROUP BY date(time)) as q2
  WHERE q1.date = q2.date and ((q1.count * 100) / q2.count) > 1

任何帮助将不胜感激。

【问题讨论】:

您实际上已经执行了查询,并尝试将结果用作子查询,仅此而已。 那么@IljaEverilä 错误的原因是什么?我该怎么办? 我现在没有办法对此进行测试,但我很确定如果你将 q1 替换为 query1 并将 q2 替换为 query2 会起作用。跨度> @themanatuf 替换得到相同的错误 => AttributeError: 'Select' object has no attribute 'l_date' ...看起来我的别名 l_date 和 s_count 不在查询结果中。同样,单独执行子查询会返回预期结果。 请阅读docs.sqlalchemy.org/en/latest/core/tutorial.html#using-aliases和docs.sqlalchemy.org/en/latest/orm/…,看看他们是否有帮助。 【参考方案1】:

我知道出了什么问题。子查询缺少别名。为了使它工作,我修改了子查询如下:

query1 = db.select([func.DATE(log.columns.time).label('l_date'), func.count(log.columns.status).label('s_count')]) \
        .where(or_(log.columns.status.like('%5%'), log.columns.status.like('%4%'))) \
        .group_by(func.DATE(log.columns.time)).alias('query1')


    query2 = db.select([func.DATE(log.columns.time).label('l_date'),
                          func.count(log.columns.status).label('s_count')]) \
        .group_by(func.DATE(log.columns.time)).alias('query2')

【讨论】:

以上是关于SQLAlchemy 子查询列表对象没有属性的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy 子查询 - 总和的平均值

您如何设置 sqlalchemy 关系ihp,以便子查询负载将根据属性过滤我们的结果

SQLAlchemy 关系错误:对象没有属性“c”

Sqlalchemy 子查询

需要帮助构建 SQLAlchemy 查询 + 子查询

简单子查询的混淆 SQLAlchemy 转换