文章内容
2022/1/13 18:53:05,作 者: 黄兵
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) students = db.relationship("Student", secondary=student_identifier) s = Student() c = Class() c.students.append(s) db.session.add(c) db.session.commit()
我们可以对 s 和 c 指定插入数据,例如:
s = Student(user_id=1,user_firstName='Ryan',user_lastName='Mitchell',user_email='123@pdf-lib.org') c = Class(class_id=1,class_name='Python')
同时我们也可以指定 s 为 Student 查询条件的结果:
s = db.session.query(Student).get(1)
之后对查询的结果经行增加到辅助表。
但让我们也可以直接对辅助表(student_identifier)经行操作:
student_identifier
定义为 SQLAlchemy 反射表而不是数据库。
通常,如果您在模型和反射表对象之间正确设置了所有关系,则只需处理相关模型(通过将模型对象附加到关系 InstrumentList 中)即可将数据插入反射表。
但是,如果您不想设置关系,确实有一种方法可以直接插入到反射表中:
statement = student_identifier.insert().values(class_id=cl1.id, user_id=sti1.id) db.session.execute(statement) db.session.commit()
如果我们一次添加多个条目,可以使用 extend:
class_ = db.session.query(Class).first() new_students = db.session.query(Student).all() class_.students.extend(new_students) db.session.add(class_) db.session.commit()
如果我们需要删除反射表(辅助表),可以参考这篇文章:SQLAlchemy 辅助表删除记录
参考资料:
评论列表