2014-09-04 5 views
37

मैं कुप्पी के SQLAlchemy में कई संबंध यहाँ करने के लिए एक बहुत बनाने के लिए कोशिश कर रहा हूँ, लेकिन ऐसा लगता है मैं नहीं जानता कि कितने पहचानकर्ता डेटाबेस के लिए "कई को भरने के लिए "। क्या आप कृपया मुझे यह समझने में मदद कर सकते हैं कि मैं क्या गलत कर रहा हूं और इसे कैसे देखना चाहिए?बोतल SQLAlchemy कई-से-अनेक डालने डेटा

class User(db.Model): 
    __tablename__ = 'users' 
    user_id = db.Column(db.Integer, primary_key=True) 
    user_fistName = db.Column(db.String(64)) 
    user_lastName = db.Column(db.String(64)) 
    user_email = db.Column(db.String(128), unique=True) 


class Class(db.Model): 
    __tablename__ = 'classes' 
    class_id = db.Column(db.Integer, primary_key=True) 
    class_name = db.Column(db.String(128), unique=True) 

और फिर मेरी पहचानकर्ता डेटाबेस:

student_identifier = db.Table('student_identifier', 
    db.Column('class_id', db.Integer, db.ForeignKey('classes.class_id')), 
    db.Column('user_id', db.Integer, db.ForeignKey('users.user_id')) 
) 

अब तक यह इस तरह दिखता है जब मैं डेटाबेस में डेटा सम्मिलित करने के लिए प्रयास करें।

# User 
user1 = User(
      user_fistName='John', 
      user_lastName='Doe', 
      user_email='[email protected]') 

user2 = User(
      user_fistName='Jack', 
      user_lastName='Doe', 
      user_email='[email protected]') 

user3 = User(
      user_fistName='Jane', 
      user_lastName='Doe', 
      user_email='[email protected]') 

db.session.add_all([user1, user2, user3]) 
db.session.commit() 

# Class 
cl1 = Class(class_name='0A') 
cl2 = Class(class_name='0B') 
cl3 = Class(class_name='0C') 
cl4 = Class(class_name='Math') 
cl5 = Class(class_name='Spanish') 
db.session.add_all([cl1, cl2, cl3, cl4, cl5]) 
db.session.commit() 

अब मेरी समस्या, मैं कैसे कई लोगों के लिए कई डेटाबेस के लिए, के बाद से मैं वास्तव में एक 'student_identifier' वस्तु नहीं बना सकते में शामिल कर सकता है? मैं यह शायद इस तरह देखा जा सकता था सकता है:

# Student Identifier 
sti1 = StiClass(class_id=cl1.class_id, class_name=user1.user_id) 
sti2 = StiClass(class_id=cl3.class_id, class_name=user1.user_id) 
sti3 = StiClass(class_id=cl4.class_id, class_name=user1.user_id) 
sti4 = StiClass(class_id=cl2.class_id, class_name=user2.user_id) 
db.session.add_all([sti1, sti2, sti3, sti4]) 
db.session.commit() 

मैं कैसे ORM के साथ कई मेज पर एक कई में सम्मिलित करना चाहिए?

उत्तर

62

आपको सीधे अपनी एसोसिएशन टेबल पर कुछ भी जोड़ने की ज़रूरत नहीं है, SQLAlchemy ऐसा करेगा। यह और अधिक या SQLAlchemy documentations से कम है:

association_table = db.Table('association', db.Model.metadata, 
    db.Column('left_id', db.Integer, db.ForeignKey('left.id')), 
    db.Column('right_id', db.Integer, db.ForeignKey('right.id')) 
) 

class Parent(db.Model): 
    __tablename__ = 'left' 
    id = db.Column(db.Integer, primary_key=True) 
    children = db.relationship("Child", 
        secondary=association_table) 

class Child(db.Model): 
    __tablename__ = 'right' 
    id = db.Column(db.Integer, primary_key=True) 


p = Parent() 
c = Child() 
p.children.append(c) 
db.session.add(p) 
db.session.commit() 

इसलिए अपने नमूना इस तरह होगा:

student_identifier = db.Table('student_identifier', 
    db.Column('class_id', db.Integer, db.ForeignKey('classes.class_id')), 
    db.Column('user_id', db.Integer, db.ForeignKey('students.user_id')) 
) 

class Student(db.Model): 
    __tablename__ = 'students' 
    user_id = db.Column(db.Integer, primary_key=True) 
    user_fistName = db.Column(db.String(64)) 
    user_lastName = db.Column(db.String(64)) 
    user_email = db.Column(db.String(128), unique=True) 


class Class(db.Model): 
    __tablename__ = 'classes' 
    class_id = db.Column(db.Integer, primary_key=True) 
    class_name = db.Column(db.String(128), unique=True) 
    children = db.relationship("Student", 
        secondary=student_identifier) 

s = Student() 
c = Class() 
c.children.append(s) 
db.session.add(c) 
db.session.commit() 
1

पहले, student_identifier एक SQLAlchemy प्रतिबिंब तालिका एक डेटाबेस नहीं के रूप में परिभाषित किया गया है।

आम तौर पर यदि आपके पास मॉडल और प्रतिबिंब तालिका ऑब्जेक्ट्स के बीच सभी रिलेशनशिप सेटअप ठीक से हैं, तो आपको प्रतिबिंब तालिकाओं में डेटा डालने के लिए केवल संबंधित मॉडल (रिलेशनशिप इंस्ट्रूमेंटलिस्ट में मॉडल ऑब्जेक्ट्स जोड़कर) से निपटने की आवश्यकता होगी, उदाहरण के लिए , उपरोक्त प्रदान किया गया @ मेहदी-सादेघी उत्तर।

हालांकि, अगर आप संबंध स्थापित नहीं करना चाहते हैं तो वास्तव में प्रतिबिंब तालिकाओं में सीधे डालने का एक तरीका है। उदाहरण के लिए:

statement = student_identifier.insert().values(class_id=cl1.id, user_id=sti1.id) 
db.session.execute(statement) 
db.session.commit() 

उसके बाद, आप को देखने के लिए है कि एक बहुत-से-अनेक संबंध पंक्ति student_identifier प्रतिबिंब तालिका में डाला जाता है सक्षम होना चाहिए। लेन-देन में किए गए प्रत्येक SQL कथन को निष्पादित करने के बाद प्रतिबद्ध होना न भूलें।

आशा है कि आपको वैकल्पिक दृष्टिकोण के साथ मदद मिलेगी।