Flask sqlalchemy多对多插入数据
问候 ,
我试图在Flask-SQLAlchemy中创build一个多对多的关系,但似乎我不知道如何填充“多对多标识符数据库” 。 你能帮我理解我做错了什么,应该怎么看?
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='john@doe.es') user2 = User( user_fistName='Jack', user_lastName='Doe', user_email='jack@doe.es') user3 = User( user_fistName='Jane', user_lastName='Doe', user_email='jane@doe.es') 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()
现在我的问题是,我如何添加到多对多的数据库,因为我真的不能创build一个'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多表到多表?
你不需要添加任何东西直接到你的关联表,SQLAlchemy会做到这一点。 这或多或less来自SQLAlchemy文档 :
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()
首先, student_identifier
被定义为SQLAlchemyreflection表而不是数据库。
通常情况下,如果模型和reflection表对象之间的关系设置正确,则只需要处理相关模型(通过将关系模型对象添加到InstrumentList关系中),以便将数据插入到reflection表中,例如answer @上面提供的mehdi-sadeghi。
然而,如果你不想build立关系,确实有一种直接插入到reflection表的方法。 例如:
statement = student_identifier.insert().values(class_id=cl1.id, user_id=sti1.id) db.session.execute(statement) db.session.commit()
之后,您应该能够看到多对多关系行被插入到student_identifier
reflection表中。 在执行每个SQL语句之后,不要忘记在事务中执行它们。
希望能帮助你一个替代方法。