2011-04-15 12 views
9

मेरे पास स्क्लेक्लेमी में एक पेड़ का प्रतिनिधित्व करने वाले स्वयं रेफरेंसियल मैपिंग 'बच्चों' (बैकफ्र 'पैरेंट') के साथ एक कक्षा नोड है और मैं पूरे पेड़ का चयन करना चाहता हूं। अगर मैंएक एसक्यूएलकेमी आसन्नता सूची रिश्ते से पूरे पेड़ का निर्माण

session.query(Node).all() 

तब नोड.चिल्डेरेन की हर पहुंच एक चयन को ट्रिगर करता है। अगर मैं एक में शामिल हो गए लोड

session.query(Node).options(joinedload_all('children')).all() 

करना तो एसक्यूएल जारी एक अनावश्यक तालिका में शामिल होने के बाद से मैं पूरे पेड़ (सभी नोड्स) वैसे भी चाहते हैं। क्या एसए में ऐसा करने का कोई तरीका है या क्या मुझे बस एसए के बाहर अपने पेड़ का निर्माण करना चाहिए?

उत्तर

12

मूल संपत्ति के साथ कोई समस्या नहीं है, क्योंकि आवश्यक सभी जानकारी पहले से ही ऑब्जेक्ट में लोड की गई है। SQLAlchemy को केवल सत्र में मूल ऑब्जेक्ट की तलाश करनी है और जब यह गुम हो तो केवल समस्या को हल करना होगा। लेकिन यह बच्चों के लिए काम नहीं करता है: पुस्तकालय यह सुनिश्चित नहीं कर सकता कि सभी बच्चों की वस्तुएं सत्र में पहले से ही हैं। तो आप पेड़ का निर्माण कर सकते हैं और set_committed_value:

from collections import defaultdict 
from sqlalchemy.orm.attributes import set_committed_value 

nodes = session.query(Node).all() 

# Collect parent-child relations 
children = defaultdict(list) 
for node in nodes: 
    if node.parent: 
     children[node.parent.id].append(node) 

# Set collected values 
for node in nodes: 
    set_committed_value(node, 'children', children[node.id]) 
+1

बहुत बढ़िया के माध्यम से इस डेटा का उपयोग करने के लिए SQLAlchemy को निर्देश दे सकते हैं। पेड़ के निर्माण के साथ मेरा हिचकिचाहट नोड ऑब्जेक्ट्स को गंदे कर रहा था, set_committed_value मुझे जो चाहिए वह है। धन्यवाद। – SquaredLoss

संबंधित मुद्दे