python - 加入 SQLAlchemy 中的子查询

标签 python sql sqlalchemy greatest-n-per-group

我有以下 SQL 查询(它是每组特定列中最大的,有 3 个要分组的东西):

select p1.Name, p1.nvr, p1.Arch, d1.repo, p1.Date
from Packages as p1 inner join
    Distribution as d1
    on p1.rpm_id = d1.rpm_id inner join (
        select Name, Arch, repo, max(Date) as Date
        from Packages inner join Distribution
            on Packages.rpm_id = Distribution.rpm_id
        where Name like 'p%' and repo not like '%staging'
        group by Name, Arch, repo
    ) as sq
    on p1.Name = sq.Name and p1.Arch = sq.Arch and d1.repo = sq.repo and p1.Date = sq.Date
    order by p1.nvr

我正在尝试将其转换为 SQLAlchemy。这是我目前所拥有的:

p1 = aliased(Packages)
d1 = aliased(Distribution)
sq = session.\
        query(
            Packages.Name,
            Packages.Arch,
            Distribution.repo,
            func.max(Packages.Date).\
                                        label('Date')).\
        select_from(
            Packages).\
        join(
            Distribution).\
        filter(
            queryfilter).\
        filter(
            not_(Distribution.repo.\
                                    like('%staging'))).\
        group_by(
            Packages.Name,
            Packages.Arch,
            Distribution.repo).subquery()

result = session.\
            query(
                p1, d1.repo).\
            select_from(
                p1).\
            join(
                d1).\
            join(
                sq,
                p1.Name==sq.c.Name,
                p1.Arch==sq.c.Arch,
                d1.repo==sq.c.repo,
                p1.Date==sq.c.Date).\
            order_by(p1.nvr).all()

当我对子查询进行连接时出现问题。我收到一条错误消息,指出没有从中加入的 from 子句。这很奇怪,因为我在连接函数中的子查询之后指定了一个作为参数。知道我做错了什么吗?也许我需要别名并再次执行 select_from?

编辑:确切错误

Could not find a FROM clause to join from. Tried joining to SELECT "Packages"."Name", "Packages"."Arch", "Distribution".repo, max("Packages"."Date") AS "Date" FROM "Packages" JOIN "Distribution" ON "Packages".rpm_id = "Distribution".rpm_id WHERE "Packages"."Name" LIKE :Name_1 AND "Distribution".repo NOT LIKE :repo_1 GROUP BY "Packages"."Name", "Packages"."Arch", "Distribution".repo, but got: Can't find any foreign key relationships between 'Join object on %(139953254400272 Packages)s(139953254400272) and %(139953256322768 Distribution)s(139953256322768)' and '%(139953257005520 anon)s'.

它正在尝试加入,但它说它不知道在哪里进行加入。我的语法有问题吗?根据 join 函数中的内容,我认为这是正确的。

最佳答案

显然您需要在多个连接条件周围添加一个and()

join(
    sq,
    and_(p1.Name==sq.c.Name,
    p1.Arch==sq.c.Arch,
    d1.repo==sq.c.repo,
    p1.Date==sq.c.Date)).\

关于python - 加入 SQLAlchemy 中的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18474311/

相关文章:

python - Django 1.8 UpdateView 生成 405 错误和空白模板

python - 识别连续的数据序列并计算其长度

sql - 如何根据其他列的值更新列

python - 如何优雅地检查对象/实例/变量的存在,如果它存在于python中,同时将其分配给变量?

python - yield_per 期间出现 sqlalchemy 游标错误

python - 我的Python生成器函数真的很懒吗?

python - 分别读取不同的流

mysql - 内连接和外连接的顺序重要吗?

sql - SQL 中避免重复子查询的最佳方法

python - Flask SQLAlchemy order_by 关系