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