2012-08-28 16 views
20

मैं सबसे तेज़ एक नया SQLAlchemy ऑब्जेक्ट बनाने के लिए देख रहा हूं, अगर यह पहले से ही डेटाबेस में मौजूद नहीं है।एक नया ऑब्जेक्ट बनाने के लिए सबसे तेज़ तरीका केवल तभी होता है जब यह पहले से मौजूद नहीं है (SQLAlchemy)

जिस तरह से मैं इसे कर रहा हूं, अब यह जांचने के लिए क्वेरी की गिनती हो रही है कि यह मौजूद है या नहीं, और यदि नहीं - तो मैं इसे बना देता हूं। ईजी:

if not User.query.filter(email=user.email).count(): 
    db.session.add(user) 
    db.session.commit() 

क्या यह करने का सबसे अच्छा तरीका है? कुछ प्रतिक्रिया पसंद करेंगे। धन्यवाद!

+1

आपको शायद यह निर्णय लेने के लिए इस डीज़पेज़ आलेख को पढ़ना चाहिए कि इनमें से कुछ अपडेट-या-डालने-अगर-मौजूद नहीं हैं, तो नौकरियां हो सकती हैं: http://www.depesz.com/2012/06/10/क्यों-ups-upsert-so-complicated/ –

+1

गति के लिए: आपके द्वारा किए गए सभी को डेटाबेस को हिट करने के लिए एक राउंड ट्रिप करना होगा। मुझे संदेह है कि आप जो कर रहे हैं उसके बीच एक बड़ा अंतर देखेंगे और 'EXISTS' क्वेरी कहें। बड़ी समय की लागत तीन राउंड ट्रिप (एक 'चयन', एक 'INSERT', एक' COMMIT') है, न कि प्रश्न स्वयं। यदि आप गति चाहते हैं, तो आपको बड़े प्रश्नों में काम को बैच करना होगा, लेनदेन के भीतर और अधिक काम करना होगा, और जहां संभव हो वहां सर्वर-साइड फ़ंक्शंस का उपयोग करना होगा। –

+1

तालिका में रिकॉर्ड कितनी बार मौजूद हैं? 50/50? 80/20? यदि अधिकांश समय रिकॉर्ड मौजूद नहीं होता है तो आप इसे केवल सम्मिलित कर सकते हैं और अजीब यूक्यू उल्लंघन को पकड़ सकते हैं। –

उत्तर

16

मुझे पता चला है कि another SO answer पर उल्लिखित get_or_create फ़ंक्शन मेरी आवश्यकताओं को पूरा करता है।