文章内容
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='[email protected]') 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 辅助表删除记录
参考资料:
评论列表