कई स्तंभों में अद्वितीय sqlalchemy


174

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

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 में आवश्यकता को आसानी से जोड़ने का कोई तरीका नहीं है। विशिष्ट क्षेत्र पर लागू होने पर अद्वितीय = सही विकल्प केवल काम करने लगता है और यह पूरी तालिका को सभी स्थानों के लिए केवल एक अद्वितीय कोड होगा।

जवाबों:


298

से निकालें प्रलेखन की Column:

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

चूंकि ये टेबल के हैं और मैप्ड क्लास के नहीं हैं, इसलिए कोई टेबल की परिभाषा में घोषणा करता है, या यदि डिक्लेरेटिव का उपयोग करता है __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'),
                     )

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

1
@देव: आप किस आरडीबीएमएस का उपयोग करते हैं?
वैन

3
धन्यवाद, लेकिन मेरा सवाल था: क्या आपने DB स्कीमा बनाने के लिए SA (और फ्लास्क) का उपयोग किया था, या इसे अलग से बनाया था?
वैन

1
क्यों है .सी। उपयोग किया गया?
स्माइली

1
@Smiley.c..columns.
वैन

7
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

class Location(Base):
      __table_args__ = (
        # this can be db.PrimaryKeyConstraint if you want it to be a primary key
        db.UniqueConstraint('customer_id', 'location_code'))
      customer_id = Column(Integer,ForeignKey('customers.customer_id')
      location_code = Column(Unicode(10))

1
होना चाहिए __table_args__ = (db.UniqueConstraint('customer_id', 'location_code'),), अंत में अल्पविराम मत भूलना।
बेर्टिडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.