SQLAlchemy:现有列没有这样的列

2024-04-23 19:02:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个用作column_property的查询。你知道吗

表说明(相关字段):

  • 会话

    • 环境\u id(以下环境表键上的外键)
    • 会话\u id
    • 开始时间(列\u属性)
    • 结束时间(列属性)
  • 跑步

    • 会话\u id(与会话表中的会话\u id匹配)
    • 测试id(下面测试表键上的外键)
    • 开始时间
    • 结束时间
  • 测试

    • 键(主键)
    • 环境\u id(以下环境表键上的外键)
  • 环境

    • 键(主键)

我试图通过选择所有通过测试表匹配的运行来计算会话开始时间,对于给定的会话。然后得到开始时间的最小值。你知道吗

我对start_time的第一次尝试如下:

start_time = column_property(
     select([func.min(Run.start_time)]).
     where(Run.session_id == session_id).
     where(Environment.key == environment_id))

但是对于给定会话中的所有环境,这都是相同的start_time。你知道吗

我试着改进它(见下文)。你知道吗

但失败的原因如下: sqlite3.OperationalError: no such column: sessions.environment_id

虽然我看到环境id在上面定义了几行:

class Session(BASE):
    key = Column(Integer, primary_key=True)
    session_id = Column(Integer)
    environment_id = Column(Integer, ForeignKey("environments.key"))
    environment = relationship("Environment")

    start_time = column_property(
        select([func.min(Run.start_time)]).
        select_from(
            Run.__table__.join(Test.__table__, Run.test_id == Test.key)).
        where(Run.session_id == session_id).
        group_by(environment_id))

根据我对SQL的反复试验,我尝试生成以下查询:

    SELECT MIN(runs.start_time) FROM
        runs JOIN tests ON runs.test_id = tests.key
    WHERE runs.session_id = ? GROUP BY environment_id

我非常感谢你的帮助

更新:我更新了Session类代码


Tags: keyrunidenvironment环境timesession时间
2条回答

在字段前添加表名。i、 电子

where(Run.session_id == Session.session_id).
group_by(Session.environment_id)).

我得到错误sqlite3.OperationalError: no such column: sessions.environment_id的原因是我试图从Run表和Test表之间的联接中进行选择。所以我不能从Session表中GROUP BY一个字段。你知道吗

解决方案基本上是两种尝试的交叉:

    start_time = column_property(
        select([func.min(Run.start_time)]).
        select_from(Run.__table__.join(Test)).
        where(Run.session_id == session_id).
        where(Test.environment_id == environment_id))

因此,我需要创建一个JOIN,正如我从第二次尝试中推断的那样。但是我需要另一个WHERE语句来代替GROUP BY,以便只选择那些具有给定会话ID并且属于具有给定环境ID的测试的运行

相关问题 更多 >