2013-08-27 4 views
13

のサブクエリに参加しますSQLAlchemyへ。これは私がこれまで持っているものです:は、私はfollwing SQLクエリ(これは、グループに3つの事で、グループごとに特定のカラムの最大のget)を持っている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句が参加していないことを示すエラーが表示されます。これは、引数として結合関数のサブクエリの直後に1つを指定するため、奇妙です。私が間違っていることは何か考えていますか?おそらく私は何かをエイリアスして、select_fromをもう一度やり直す必要がありますか?

EDIT:参加しようとしているが、それはそれは参加するためにどこを知らないと言う

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関数の中身に基づいて正しいと思います。

+0

サブクエリのエイリアスを試み、リテラル結合条件を使用してみます。ここで少し時間切れにする必要があるかもしれません。 – javex

+0

リテラル結合条件はどのように使用できますか?それはどういう意味ですか?私は特定のエラーで自分の投稿を更新しました。 – miscsubbin

答えて

11

明らかに、複数の結合条件の周りにand_()を追加する必要があります。

join(
    sq, 
    and_(p1.Name==sq.c.Name, 
    p1.Arch==sq.c.Arch, 
    d1.repo==sq.c.repo, 
    p1.Date==sq.c.Date)).\ 
関連する問題