MYSQL 没有 RawQuery 的 PeeWee 完全连接

MYSQL PeeWee Full Join without RawQuery

我在 MySQL 中使用 PeeWee。我有两个表需要完全连接来保存左右两侧的记录。 MySQL 不直接支持这一点,但我在这篇有用的文章中使用了 "Method 2" - http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/ 来创建似乎适用于我的数据的 Full Join SQL 语句。 它需要 "LEFT OUTER JOIN" 和 "RIGHT OUTER JOIN" 的 "UNION ALL",使用第二个结果集中重复数据的排除。

我正在匹配两个表中的备份磁带条形码。 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 将其引入我的 python 脚本时,我发现似乎没有 JOIN.RIGHT_OUTER 允许我重新创建此 SQL。 JOIN.LEFT_OUTER 我以前用过很多,但这是我第一次需要 Full Join。

当然,我可以让 PeeWee 使用 RawQuery(),但如果可以的话,我希望让我的代码看起来更优雅。

有没有人设法在不借助 RawQuery 的情况下使用 MySQL 和 PeeWee 重新创建完全连接?

我曾设想过类似以下内容(我知道这是无效的):-

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

您可以添加对右外圈的支持:

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

那你可以用JOIN.RIGHT_OUTER.