2009-12-31 11 views
6

मैं अपने मॉडल में एक कॉलम के रूप में डेटाटाइप का प्रतिनिधित्व करना चाहता हूं, लेकिन वास्तव में डेटा डेटाबेस में एकाधिक कॉलम में संग्रहीत किया जाएगा। मुझे SQLAlchemy में ऐसा करने के तरीके पर कोई अच्छा संसाधन नहीं मिल रहा है।SQLAlchemy कस्टम प्रकार जिसमें एकाधिक कॉलम हैं

मैं अपने मॉडल चाहते हैं इस तरह देखने के लिए (यह मेरी वास्तविक समस्या के बजाय ज्यामिति जो कठिन है समझाने के लिए उपयोग कर एक सरल उदाहरण है):

class 3DLine(DeclarativeBase): 
    start_point = Column(my.custom.3DPoint) 
    end_point = Column(my.custom.3DPoint) 

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

मैं यह पता लगाने में सक्षम था कि एकल कॉलम in the documentation का उपयोग करके कस्टम प्रकार कैसे बनाएं। लेकिन कोई संकेत नहीं है कि मैं एक ही प्रकार को एकाधिक कॉलम में मैप कर सकता हूं।

मुझे लगता है कि मैं इसे एक अलग तालिका का उपयोग कर पूरा कर सकता हूं, और प्रत्येक कॉलम एक विदेशी कुंजी होगी, लेकिन मेरे मामले में मुझे नहीं लगता कि यह प्रत्येक बिंदु के लिए एक अलग करने के लिए एक मैपिंग करने का अर्थ है तालिका, और यह अभी भी संबंधित मानों को एक साथ सेट करने की क्षमता नहीं देता है।

उत्तर

7

यहाँ एक न्यूनतम उदाहरण documentation पर आधारित है:

class 3DPoint(object): 
    def __init__(self, x, y, z): 
     self.x = x 
     self.y = y 
     self.z = z 

    def __composite_values__(self): 
     return (self.x, self.y, self.z) 

class 3DLine(DeclarativeBase): 
    start_point = sqlalchemy.orm.composite(
     3DPoint, 
     Column('start_point_x', Integer, nullable=False), 
     Column('start_point_y', Integer, nullable=False), 
     Column('start_point_z', Integer, nullable=False), 
    ) 
+0

यह एक-बार उपयोग के लिए महान है, लेकिन है कि दृष्टिकोण यह असंभव इसे बाहर एक अलग प्रकार के रूप में, इसके बाद के संस्करण की तरह कारक मामलों में बना देता है जब वहाँ एक ही प्रकार के दो संयुक्त क्षेत्र हैं (start_point और end_point) - कॉलम नामों का दोहराव होगा। क्या कॉलम नामों के स्वचालित अनुमान का उपयोग करना संभव है जो सिंगल-कॉलम फ़ील्ड के लिए काम करता है, और बस "_x", "_y" और "_z" को जोड़ता है? (मेटा: क्या मुझे इस बारे में SO पर एक अलग सवाल पूछना चाहिए?) – Veky

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