文章内容

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 辅助表删除记录


参考资料:

1、Flask sqlalchemy many-to-many insert data

分享到:

发表评论

评论列表