2008-11-03 17 views
11

स्क्लाक्लेमी के साथ, क्या यह पता लगाने का कोई तरीका है कि कोई संबंध आलसी लोड हो जाएगा?
उदाहरण के लिए, आलसी माता-पिता-> बच्चों के संबंध और "अभिभावक" का एक उदाहरण एक्स दिया गया है, मैं जानना चाहता हूं कि क्वेरी को ट्रिगर किए बिना "X.children" पहले ही लोड हो चुका है या नहीं।एसक्यूएलकेमी के साथ अभी तक आलसी संबंध लोड नहीं होने पर कैसे पता लगाना है?

उत्तर

4

मुझे लगता है कि आप बच्चे के __dict__ विशेषता शब्दकोश को देख सकते हैं ताकि यह जांच सके कि डेटा पहले से ही है या नहीं।

+0

यह काम करता है, धन्यवाद :) – Joril

3

Haes जवाब की तुलना में थोड़ा neater (हालांकि यह प्रभावी रूप से एक ही बात करता है) के रूप में, hasattr (उपयोग करने के लिए) है:

>>> hasattr(X, 'children') 
False 
+0

अच्छा, धन्यवाद :) – Joril

+2

यह साथ काम नहीं करता वर्तमान sqlalchemy। 'हैट्टर (ओबीजे, फील्ड)' ओबीजे में 'फ़ील्ड के बराबर नहीं है .__ dict__'। –

+0

मैंने स्क्लेक्लेमी 0.8 में परीक्षण किया है और ऑब्जेक्ट अलग होने पर यह काम करता है। हालांकि अगर यह जुड़ा हुआ है तो हैशर का उपयोग करके 'बच्चों' के आलसी भार को ट्रिगर करता है, जो शायद आप नहीं चाहते हैं। इसके बजाए 0.8 में हम निरीक्षण() कॉल का उपयोग कर सकते हैं: res.unloaded में 'res = निरीक्षण (एक्स) ''' बच्चों '- जो काम करता है कि वस्तु संलग्न है या अलग है। – foz

10

आप सभी उतार संपत्तियों की एक सूची प्राप्त कर सकते हैं (दोनों संबंधों और कॉलम) sqlalchemy.orm.attributes.instance_state(obj).unloaded से।

देखें: Completing object with its relations and avoiding unnecessary queries in sqlalchemy

एक आसान तरीका inspect(), जो एक ही परिणाम देता है उपयोग करने के लिए है:

from sqlalchemy import inspect 
from sqlalchemy.orm import lazyload 

user = session.query(User).options(lazyload(User.articles)).first() 
ins = inspect(user) 

ins.unloaded # <- set or properties that are not yet loaded 
संबंधित मुद्दे