0

タイトルで説明する方法がよくわかりませんでしたが、これが私が直面していることです。

私が書く必要があるのは、比較的単純なクエリだと思っていたものです(とにかくSQLで):

SELECT 
    tasks.*, 
    resource_contact.*, 
    client_contact.* 
FROM 
    tasks, 
    TaskResReln,
    contact resource_contact,
    TaskContact
    contact client_contact,
WHERE
    tasks.task_id = TaskResReln.task_id
    AND TaskResReln.contact_code = resource_contact.contact_code
    AND tasks.task_id = TaskContact.task_id
    AND TaskContact.contact_code = client_contact.contact_code

私の目にはあまり質問はありません。非常に簡単です...ただし、これをSQL Alchemyクエリに変換すると、

tasks = db.session.query(Tasks,client_contact,resource_contact)\
    .join(TaskResReln, resource_contact)\
    .reset_joinpoint()\
    .join(TaskContact, client_contact)

ここでの私の考えは(そしてマニュアルを理解しようとすることから)でした。「Tasks」は query() の最初のモデルであるため、リセットポイントにする必要がありますか? そこで、まずリソース側に参加し、参加をリセットしてから、クライアント側に参加すると思いました...違います。

次の SQL が生成されます。

FROM 
    tasks JOIN task_res_reln ON tasks.task_id = task_res_reln.task_id 
    JOIN contact AS contact_2 ON contact_2.contact_code = task_res_reln.contact_code 
    JOIN task_contact ON contact_2.contact_code = task_contact.contact_code 
    JOIN contact AS contact_1 ON contact_1.contact_code = task_contact.contact_code

ご覧のように; 最初の部分は、task_contact に到達するまで泳いでいます...その後、すべてがそこから南に進みます。

どうすればクエリを達成できますか? 正しい方向への指針をいただければ幸いです。

4

1 に答える 1

3

(フラグが渡されたとき)reset_joinpoint()の自動エイリアシングで使用されることを意図したドキュメントから印象を受けます。あなたの場合、自分で句を提供できます:join()aliased=TrueON

q = session.query(Tasks, client_contact, resource_contact).\
    join(TaskResReln).\
    join(resource_contact).\
    join(TaskContact, Tasks.task_id == TaskContact.task_id).\
    join(client_contact)
于 2013-08-18T09:48:06.843 に答える