我在MySQL中使用PeeWee。我有两个需要完全连接的表,以保留左侧和右侧的记录。 MySQL不直接支持此功能,但是我在此有用的文章-http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/中使用了“方法2”来创建似乎适用于我的数据的Full Join SQL语句。
使用第二个结果集中的重复数据,它要求“左外连接”和“右外连接”的“所有连接”。

我要匹配两个表中的备份磁带条形码。
的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脚本时,我发现似乎没有允许我重新创建此SQL的JOIN.RIGHT_OUTER。我过去曾大量使用过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

最佳答案

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

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


然后,您可以使用JOIN.RIGHT_OUTER

关于python - 没有RawQuery的MYSQL PeeWee完全连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34787309/

10-12 21:08