2014-09-04 23 views
37

tôi đang cố gắng để thực hiện một nhiều với nhiều mối quan hệ ở đây trong Flask-SQLAlchemy, nhưng có vẻ như tôi không biết làm thế nào để lấp đầy "nhiều đến nhiều cơ sở dữ liệu nhận dạng ". Bạn có thể vui lòng giúp tôi hiểu những gì tôi đang làm sai và nó trông như thế nào?Flask SQLAlchemy nhiều-nhiều dữ liệu chèn

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) 

và sau đó cơ sở dữ liệu nhận dạng của tôi:

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')) 
) 

cho đến nay nó trông như thế này khi tôi cố gắng để chèn dữ liệu vào cơ sở dữ liệu.

# 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() 

Bây giờ vấn đề của tôi là, làm cách nào để thêm vào nhiều cơ sở dữ liệu, vì tôi thực sự không thể tạo đối tượng 'student_identifier'? Nếu tôi có thể nó có thể trông giống như thế này:

# 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() 

Làm cách nào tôi có thể chèn vào nhiều bảng với nhiều ORM?

Trả lời

62

Bạn không cần phải thêm bất kỳ thứ gì trực tiếp vào bảng kết hợp của mình, SQLAlchemy sẽ làm điều đó. Đây là nhiều hơn hoặc ít hơn từ 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() 

Do đó mẫu của bạn sẽ như thế này:

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

Trước hết, student_identifier được định nghĩa là một bảng SQLAlchemy phản ánh không phải là một cơ sở dữ liệu.

Thông thường nếu bạn có tất cả thiết lập mối quan hệ đúng giữa mô hình và đối tượng bảng phản chiếu, bạn sẽ chỉ cần xử lý các mô hình liên quan (bằng cách thêm các đối tượng mô hình vào mối quan hệ InstrumentList) để chèn dữ liệu vào bảng phản chiếu. , câu trả lời @ mehdi-sadeghi được cung cấp ở trên.

Tuy nhiên, thực sự có cách chèn trực tiếp vào bảng phản chiếu nếu bạn không muốn thiết lập mối quan hệ. Ví dụ:

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

Sau đó, bạn sẽ có thể thấy hàng quan hệ nhiều người được chèn vào bảng phản chiếu student_identifier. Đừng quên cam kết sau khi bạn thực hiện mỗi câu lệnh SQL khi nó được thực hiện trong một giao dịch.

Hy vọng sẽ giúp bạn với cách tiếp cận thay thế.

Các vấn đề liên quan