2013-04-16 5 views
11

मैं sqlalchemy के साथ कई से अधिक रिश्तों से निपट रहा हूं। मेरा सवाल यह है कि कई से अधिक संबंधपरक तालिका में डुप्लिकेट जोड़ी मान जोड़ने से बचें।एसक्यूएलकेमी - पायथन में कई से अधिक रिलेशनशिप टेबल में डुप्लीकेट जोड़ने से कैसे बचें?

चीजों को स्पष्ट करने के लिए, मैं आधिकारिक SQLAlchemy दस्तावेज़ से उदाहरण का उपयोग करूंगा।

Base = declarative_base() 

Parents2children = Table('parents2children', Base.metadata,                                                  
    Column('parents_id', Integer, ForeignKey('parents.id')),                                                  
    Column('children_id', Integer, ForeignKey('children.id')) 
) 

class Parent(Base): 
    __tablename__ = 'parents' 
    id = Column(Integer, primary_key=True) 
    parent_name = Column(String(45)) 
    child_rel = relationship("Child", secondary=Parents2children, backref= "parents_backref") 

    def __init__(self, parent_name=""): 
     self.parent_name=parent_name 
    def __repr__(self): 
     return "<parents(id:'%i', parent_name:'%s')>" % (self.id, self.parent_name) 

class Child(Base): 
    __tablename__ = 'children' 
    id = Column(Integer, primary_key=True) 
    child_name = Column(String(45)) 

    def __init__(self, child_name=""): 
     self.child_name= child_name 
    def __repr__(self): 
     return "<experiments(id:'%i', child_name:'%s')>" % (self.id, self.child_name) 

########################################### 

def setUp(): 
    global Session 
    engine=create_engine('mysql://root:[email protected]/db_name?charset=utf8', pool_recycle=3600,echo=False) 
    Session=sessionmaker(bind=engine) 

def add_data(): 
    session=Session() 
    name_father1=Parent(parent_name="Richard") 
    name_mother1=Parent(parent_name="Kate") 
    name_daughter1=Child(child_name="Helen") 
    name_son1=Child(child_name="John") 

    session.add(name_father1) 
    session.add(name_mother1) 

    name_father1.child_rel.append(name_son1) 
    name_daughter1.parents_backref.append(name_father1) 
    name_son1.parents_backref.append(name_father1) 

    session.commit() 
    session.close() 


setUp() 
add_data() 
session.close() 
इस कोड के साथ

, डेटा तालिकाओं में डाला है निम्नलिखित:

माता तालिका:

+----+-------------+ 
| id | parent_name | 
+----+-------------+ 
| 1 | Richard  | 
| 2 | Kate  | 
+----+-------------+ 

बच्चे मेज:

+----+------------+ 
| id | child_name | 
+----+------------+ 
| 1 | Helen  | 
| 2 | John  | 
+----+------------+ 

Parents2children तालिका

+------------+-------------+ 
| parents_id | children_id | 
+------------+-------------+ 
|   1 |   1 | 
|   1 |   2 | 
|   1 |   1 | 
+------------+-------------+ 

जैसा कि आप देख सकते हैं, वहाँ पिछले तालिका में डुप्लिकेट है ... कैसे मैं इन डुप्लिकेट जोड़ने से SQLAlchemy रोका जा सकता है?

मैं संबंध डाल करने की कोशिश की है ("बाल", माध्यमिक = ..., collection_class = सेट) लेकिन इस त्रुटि प्रदर्शित होता है:

AttributeError: 'InstrumentedSet' object has no attribute 'append' 
+0

आप की जाँच नहीं कर सके कि एक रिश्ता पहले से मौजूद है, इसे फिर से जोड़ने से पहले? – user1451340

उत्तर

6

जोड़ें PrimaryKeyConstraint (या एक UniqueKeyConstraint) अपने relationship मेज पर:

Parents2children = Table('parents2children', Base.metadata,                                                  
    Column('parents_id', Integer, ForeignKey('parents.id')),                                                  
    Column('children_id', Integer, ForeignKey('children.id')), 
    PrimaryKeyConstraint('parents_id', 'children_id'), 
) 

और अपने कोड जब आप की कोशिश में एक त्रुटि उत्पन्न होगा दोनों पक्षों से जुड़े संबंधों को प्रतिबद्ध करने के लिए। ऐसा करने की बहुत अनुशंसा की जाती है।

आदेश भी कोई त्रुटि उत्पन्न नहीं करने के लिए, बस पहले की जाँच करें:

if not(name_father1 in name_son1.parents_backref): 
    name_son1.parents_backref.append(name_father1) 
+1

जो लगभग काम करता है :) लेकिन मैं एसक्यूएल कीमिया को उदाहरण के लिए "बच्चों" तालिका में एक ही प्रविष्टियों को जोड़ने से कैसे रोक सकता हूं ?? –

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