5

私はお互いに2つのforループを持っています。ループ1の各行 'A'、 'B'、 'C​​'について、ループ2のグループ 'X'のすべての親を見つけるために階層ツリーにアクセスする必要があります。これにより、各行のパスを個別に見つける必要のあるCTEを使用できます。ループ内でCTEを使用することは、各グループIDに対してどこで一致するかを確認するための解決策ではありません。このリンクを参照しますが、フラスコのフレームワークを使用して、cronジョブのための多くのLooping hierarchy CTEPythonはdouble forループでCTEをトラバースしますか?

コードスニペットを作ることができませんでした:

私は階層内assignee_groupため にすべてのグループヘッドをメールを送信する必要が
s = select([rt_issues]).\ 
    where(
     and_(
      rt_issues.c.status !='Closed', 
      rt_issues.c.assigned_to != None 
     )) 
rs = conn.execute(s) 
if rs.rowcount > 0: 
    s4 = text('with recursive rec_grp as(select id, parent_id, name, head, 1 as level, array[id] as path_info from groups union all select grp1.id, grp1.parent_id, grp1.name, grp1.head, rc.level + 1, rc.path_info||grp1.id from groups grp1 join rec_grp rc on grp1.id = rc.parent_id) select distinct id, parent_id, name, head, path_info from rec_grp order by id') 

    rs4 = conn.execute(s4) 

    for r in rs: 
     head_list = [] 
     hierarchical_grps = [] 
     for rr in rs4: 
      if ((rr['path_info'][0] == r[rt_issues.c.assignee_group])): 
       for g in rr['path_info']: 
        hierarchical_grps.append(g) 
     hierarchical_grps = list(set(hierarchical_grps))    
     send_pending_mail(hierarchical_grps, r['id']) 
     print hierarchical_grps, 'hierarchical_grps' 

    exit(0) 

問題。どのようにこれを達成することができます。どのようにループを正しく使用するのですか?私は、sqlalchemyコアのみ、postgresql、フラスコとPythonを使用しています。私は同じもののための正確なコードが必要です。

何作品を以下に抜粋です:これはからのクエリを想定している

rs4 = con.execute(s4) 
for rr in rs4: 
    if rr['head']: 
     head_list.append(rr['id']) 

print 'group heads:', head_list 

head列がブール値であると仮定すると

mgroup = None 
s = select([rt_issues]).\ 
    where(
     and_(
      rt_issues.c.status !='Closed', 
      rt_issues.c.assigned_to != None 
     )) 
rs = conn.execute(s) 
if rs.rowcount > 0: 
    for r in rs: 
     head_list = [] 
     hierarchical_grps = [] 
     mgroup = r[rt_issues.c.assignee_group] 
     s4 = text('with recursive rec_grp as(select id, parent_id, name, head, 1 as level, array[id] as path_info from groups where id=' +str(mgroup) + 'union all select grp1.id, grp1.parent_id, grp1.name, grp1.head, rc.level + 1, rc.path_info||grp1.id from groupsgrp1 join rec_grp rc on grp1.id = rc.parent_id) select distinct id,parent_id, name, head, path_info from rec_grp order by id') 

    rs4 = conn.execute(s4) 
    for rr in rs4: 
     if ((rr['path_info'][0] == r[rt_issues.c.assignee_group])): 
      for g in rr['path_info']: 
       hierarchical_grps.append(g) 
    hierarchical_grps = list(set(hierarchical_grps)) 
    print hierarchical_grps, 'hierarchical_grps' 
    send_pending_mail(hierarchical_grps, r['id']) 
exit(0) 
+0

テーブル構造を表示できますか?ここ、またはhttp://sqlfiddle.com/#!15 –

答えて

1

、これはheadフラグを設定してグループを収集しますあなたの2番目の例が使用されます(From句の訂正に注意してください、 "groupsgrp1から"は "groups grp1"から):

WITH RECURSIVE rec_grp AS (
    SELECT 
    id, 
    parent_id, 
    name, 
    head, 
    1   AS level, 
    ARRAY [id] AS path_info 
    FROM groups 
    WHERE id = 4 
    UNION ALL 
    SELECT 
    grp1.id, 
    grp1.parent_id, 
    grp1.name, 
    grp1.head, 
    rc.level + 1, 
    rc.path_info || grp1.id 
    FROM groups grp1 
    JOIN rec_grp rc ON grp1.id = rc.parent_id 
) 
SELECT DISTINCT 
    id, 
    parent_id, 
    name, 
    head, 
    path_info 
FROM rec_grp 
ORDER BY id; 
+0

あなたは特定のIDだけを使用しています。私が欲しいのはIDのリストです。 – user956424

+0

これは、 'head'フラグが設定されているissueグループのすべての親グループをリストします。複数の問題のリスト、または1つの問題が必要ですか? – teppic

+0

複数の問題があります。一致する問題ごとに常にCTEを実行する必要がありますか? - これは避けてください。私が述べたように、実行されるとパフォーマンスへの影響を知りたい。より良い選択肢が私が探しているものです – user956424

関連する問題