python - SQLAlchemy में कई तालिकाओं में संघ कैसे हो?




union (2)

मेरे पास कुछ अलग अधिसूचना तालियां हैं, और मैं उपयोगकर्ता को उन सभी सूचनाओं को दिखाने के लिए उन सभी में एक यूनियन बनाना चाहता हूं हालांकि, संघ यह चाहिए के रूप में काम नहीं कर रहा है

पायथन कोड

def _get_notifications_query(self, unconfirmed_only=True):
    '''
    Return base query to return this users notifications.

    @param unconfirmed_only
    @return Query object
    '''        
    requests = (
        DBSession.query(FriendshipRequestNotification)
        .outerjoin(UserFriendshipRequestNotification,
                   UserFriendshipRequestNotification.notification_id==FriendshipRequestNotification.id)
        .filter(UserFriendshipRequestNotification.user_id==self.id))
    confirmations = (
        DBSession.query(FriendshipConfirmationNotification)
        .outerjoin(UserFriendshipConfirmationNotification,
                   UserFriendshipConfirmationNotification.notification_id==FriendshipConfirmationNotification.id)
        .filter(UserFriendshipConfirmationNotification.user_id==self.id))
    comments = (
        DBSession.query(CommentNotification)
        .outerjoin(UserCommentNotification,
                   UserCommentNotification.notification_id==CommentNotification.id)
        .filter(UserCommentNotification.user_id==self.id))

    if unconfirmed_only:
        requests.filter(UserFriendshipRequestNotification.is_confirmed==False)
        confirmations.filter(UserFriendshipConfirmationNotification.is_confirmed==False)
        comments.filter(UserCommentNotification.is_confirmed==False)

    return requests.union(confirmations, comments)

उपयोग करें: user._get_notifications_query (अपुष्ट नहीं = गलत)। सभी ()

एसक्यूएल उत्पन्न

SELECT anon_1.friendship_request_notifications_id AS anon_1_friendship_request_notifications_id, anon_1.friendship_request_notifications_created_at AS anon_1_friendship_request_notifications_created_at, anon_1.friendship_request_notifications_requester_id AS anon_1_friendship_request_notifications_requester_id 
FROM (SELECT friendship_request_notifications.id AS friendship_request_notifications_id, friendship_request_notifications.created_at AS friendship_request_notifications_created_at, friendship_request_notifications.requester_id AS friendship_request_notifications_requester_id 
FROM friendship_request_notifications LEFT OUTER JOIN users_friendship_request_notifications ON users_friendship_request_notifications.notification_id = friendship_request_notifications.id 
WHERE users_friendship_request_notifications.user_id = ? UNION SELECT friendship_confirmation_notifications.id AS friendship_confirmation_notifications_id, friendship_confirmation_notifications.created_at AS friendship_confirmation_notifications_created_at, friendship_confirmation_notifications.accepter_id AS friendship_confirmation_notifications_accepter_id 
FROM friendship_confirmation_notifications LEFT OUTER JOIN users_friendship_confirmation_notifications ON users_friendship_confirmation_notifications.notification_id = friendship_confirmation_notifications.id 
WHERE users_friendship_confirmation_notifications.user_id = ? UNION SELECT comment_notifications.id AS comment_notifications_id, comment_notifications.created_at AS comment_notifications_created_at, comment_notifications.comment_id AS comment_notifications_comment_id 
FROM comment_notifications LEFT OUTER JOIN users_comment_notifications ON users_comment_notifications.notification_id = comment_notifications.id 
WHERE users_comment_notifications.user_id = ?) AS anon_1

मैं इन पंक्तियों के साथ कुछ उम्मीद करता हूं

SELECT * FROM friendship_request_notifications
UNION
SELECT * FROM friendship_confirmation_notifications
UNION 
SELECT * FROM comment_notifications

इसके अलावा, क्या एसक्यूएललेमी से एकीकृत संघ के परिणामों को हल करने का कोई तरीका है?

संपादित करें

मुझे यह उल्लेख करना चाहिए कि sqlalchemy.sql.union() सही एसक्यूएल उत्पन्न करता है, लेकिन मुझे पता नहीं कि ORM (रिकॉर्ड्स / वापसी की गिनती) से इसका उपयोग कैसे करें।


मुझे नहीं लगता कि यह एक संघ के साथ काम कर सकता है, यहां तक ​​कि उम्मीद के मुताबिक क्वेरी तैयार की गई थी। आप तीन अलग-अलग ऑब्जेक्ट प्रकार पूछताछ कर रहे हैं जब ओआरएम डेटाबेस से पंक्तियों को वापस ले जाता है, तो मुझे इसके लिए सही वर्ग के लिए पंक्तियों को मैप करने का एक तरीका दिखाई नहीं देता।

इस मामले में एक यूनियन ज्यादा समझ नहीं लेता क्योंकि तीसरे कॉलम के सभी तीन तालिकाओं में एक अलग अर्थ है।

आपको तीन प्रश्नों को अलग से करना चाहिए, जब तक कि आपके तीन अधिसूचना प्रकार एक सामान्य ORM- मैपेड वर्ग से वंचित न हों। उस स्थिति में एसक्यूएललेमी एक ही बार चार प्रकार के प्रश्नों के लिए क्वेरी का समर्थन करती है, हालांकि यूनियन के साथ नहीं।


यह निश्चित रूप से एसक्लैलेमी के साथ अलग-अलग तालिकाओं के लिए संभव है, आपको ये बता देना होगा कि आप प्रत्येक तालिका से जो कॉलम ला रहे हैं, उन्हें ठीक से जोड़ा जा सकता है। कहो कि आपके पास A और B संस्थाएं हैं, ऐसा करें:

from sqlalchemy.sql.expression import label
...

a = session.query(label('col1', A.someColumn))
b = session.query(label('col1', B.someOtherColumn))
both = a.union_all(b)

इस मामले में, आपको सभी को अवगत होना A.someColumn कि अगर A.someColumn और B.someOtherColumn कुछ अन्य B.someOtherColumn को एक ही प्रकार से जबरन नहीं किया जा सकता है, तो A.someColumn B.someOtherColumn हो सकता है :)

"वास्तविक दुनिया" में एक उदाहरण के लिए, पंक्ति 85, 87 और 90 देखें:

https://gerrit.wikimedia.org/r/#/c/147312/4/wikimetrics/metrics/rolling_active_editor.py

इससे एक साथ मिलकर दो अलग-अलग तालिकाओं का एक सबक्व्यूरी बनाई जाती है उस सबक्व्यूरी का उपयोग बाद में बाद में किया जाता है, और इसके कॉलम सामान्य रूप से।





union