2016-01-14 4 views
0

Я использую PeeWee с MySQL. У меня есть две таблицы, для которых требуется полное соединение, чтобы вести записи как с левой, так и с правой стороны. MySQL не поддерживает это напрямую, но я использовал «Метод 2» в этой полезной статье - http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/, чтобы создать оператор полного соединения SQL, который, похоже, работает для моих данных. Для этого требуется «UNION ALL» «LEFT OUTER JOIN» и «RIGHT OUTER JOIN», используя исключение дублированных данных во втором результирующем наборе.MYSQL PeeWee Full Join без RawQuery

Я сопоставляю штрих-коды резервной ленты в двух таблицах. SQL

SELECT * FROM mediarecall AS mr 
LEFT OUTER JOIN media AS m ON mr.alternateCode = m.tapeLabel 
UNION ALL 
SELECT * FROM mediarecall AS mr 
RIGHT OUTER JOIN media AS m ON mr.alternateCode = m.tapeLabel 
WHERE mr.alternateCode IS NULL 

Однако, когда я пришел, чтобы принести это в мой питон скрипт, используя Peewee, я обнаружил, что там, кажется, не быть JOIN.RIGHT_OUTER, чтобы позволить мне воссоздать этот SQL. Раньше я использовал JOIN.LEFT_OUTER, но это первый раз, когда мне нужна полная регистрация.

Я могу сделать работу PeeWee с RawQuery(), конечно, но я бы хотел, чтобы мой код выглядел более изящным, если можно.

Неужели кому-нибудь удалось воссоздать полную связь с MySQL и PeeWee, не прибегая к RawQuery?

я предусмотрел что-то вроде следующего (который я знаю, является недействительным): -

left_media = (MediaRecall 
      .select() 
      .join(Media,JOIN.LEFT_OUTER, 
        on=(MediaRecall.alternateCode == Media.tapeLabel) 
        ) 
      ) 

right_media = (MediaRecall 
      .select() 
      .join(Media,JOIN.RIGHT_OUTER, 
        on=(MediaRecall.alternateCode == Media.tapeLabel) 
        ) 
      ) 
      .where(MediaRecall.alternateCode >> None) # Exclude duplicates 

all_media = (left_media | right_media) # UNION of the 2 results, which I 
             # can then use .where(), etc on 

ответ

0

Вы можете добавить поддержку для правого внешнего:

from peewee import JOIN 
JOIN['RIGHT_OUTER'] = 'RIGHT OUTER' 

Затем вы можете использовать JOIN.RIGHT_OUTER.

+0

Это было правильно - неожиданное удивление :-). Для справки людей мне также нужен UNION ALL, а не просто UNION, поэтому вместо all_media = (left_media | right_media) вместо этого я использовал all_media = left_media.union_all (right_media). Спасибо, Чарльз! – JazzyGeoff