2012-04-07 14 views
97

मान लें कि मेरे पास एक वर्ग है जो स्थानों का प्रतिनिधित्व करता है। स्थान ग्राहकों के "संबंधित" हैं। स्थान एक यूनिकोड 10 वर्ण कोड द्वारा पहचाने जाते हैं। एक विशिष्ट ग्राहक के लिए स्थानों के बीच "स्थान कोड" अद्वितीय होना चाहिए।sqlalchemy कई कॉलम में अद्वितीय

The two below fields in combination should be unique 
customer_id = Column(Integer,ForeignKey('customers.customer_id') 
location_code = Column(Unicode(10)) 

तो अगर मैं दो ग्राहकों, ग्राहक "123" और ग्राहक "456" है। दोनों में "मुख्य" नामक एक स्थान हो सकता है लेकिन न तो दो स्थान मुख्य हो सकते हैं।

मैं इसे व्यापार तर्क में संभाल सकता हूं लेकिन मैं यह सुनिश्चित करना चाहता हूं कि sqlalchemy में आसानी से आवश्यकता को जोड़ने का कोई तरीका नहीं है। अद्वितीय = सही विकल्प केवल एक विशिष्ट फ़ील्ड पर लागू होने पर ही काम करता है और यह पूरे तालिका को केवल सभी स्थानों के लिए एक अद्वितीय कोड का कारण बनता है। Column की documentation से

उत्तर

174

निकालें:

अद्वितीय - जब यह सच है, पता चलता है कि इस स्तंभ के लिए एक अनूठा बाधा हैं, या अगर सूचकांक रूप में अच्छी तरह से सही है, इंगित करता है कि सूचकांक अद्वितीय ध्वज के साथ बनाया जाना चाहिए। में एकाधिक कॉलम निर्दिष्ट करने के लिए बाधा/अनुक्रमणिका या एक स्पष्ट नाम निर्दिष्ट करने के लिए, UniqueConstraint या Index स्पष्ट रूप से संरचनाओं का उपयोग करें।

इन के रूप में एक टेबल के लिए और नहीं एक मैप की गई श्रेणी के हैं, एक वाणी तालिका परिभाषा में उन लोगों के, या यदि कथात्मक का उपयोग कर __table_args__ में के रूप में:

# version1: table definition 
mytable = Table('mytable', meta, 
    # ... 
    Column('customer_id', Integer, ForeignKey('customers.customer_id')), 
    Column('location_code', Unicode(10)), 

    UniqueConstraint('customer_id', 'location_code', name='uix_1') 
    ) 
# or the index, which will ensure uniqueness as well 
Index('myindex', mytable.c.customer_id, mytable.c.location_code, unique=True) 


# version2: declarative 
class Location(Base): 
    __tablename__ = 'locations' 
    id = Column(Integer, primary_key = True) 
    customer_id = Column(Integer, ForeignKey('customers.customer_id'), nullable=False) 
    location_code = Column(Unicode(10), nullable=False) 
    __table_args__ = (UniqueConstraint('customer_id', 'location_code', name='_customer_location_uc'), 
        ) 
+0

मैं भी यही समस्या का सामना है, लेकिन UniqueConstraint का उपयोग करके मेरी मदद नहीं की। इंडेक्स ('...') के साथ प्रयास करने के बाद मुझे एक अनूठी बाधा मिलती है। क्या इस व्यवहार के साथ कोई स्पष्टीकरण है? – swdev

+1

@ एसडब्ल्यूडीवी: आप किस आरडीबीएमएस का उपयोग करते हैं? – van

+0

मैं PostgreSQL का उपयोग कर रहा हूँ। क्या इसमें कोई समस्या है? – swdev

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