当前位置: 首页 > 面试题库 >

Flask SQLAlchemy多对多插入数据

宇文和同
2023-03-14
问题内容

我试图在 Flask-SQLAlchemy中 建立多对多关系,但似乎我不知道如何填写 “多对多标识符数据库”
。您能帮我了解我在做什么错以及应该怎么看吗?

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

现在我的问题是,由于我真的无法创建“ 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会这样做。这或多或少来自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()


 类似资料:
  • 问题内容: 我们已经为此苦苦挣扎了几天,并在网络上进行了大量搜索。 我们试图弄清楚条目如何以Django形式保存到许多字段。 例如,我们有一个新闻模型,该模型与图像具有多对多的关系。当我们将图像添加到新闻文章中时,例如ID为10、2、14的图像,我们可以看到保存新闻文章表单时的帖子值如下: photos 10 photos 2 photos 14 当我们查看多对多交叉表时,顺序没有保留。我们看不到

  • 我有下表,目前我可以更新用户对象来添加或删除角色,但我不能在创建新用户时向其添加角色(用户的角色添加到UI上的同一表单上),因为中间表User_Role希望用户的ID为Obj,所以在插入时,我自然得到一个User.user_id=?。 有什么常见的方法可以解决这个问题吗?我在考虑也许尝试在保存后获取插入用户的ID,然后调用更新函数。我不想这样做,因为我担心性能,特别是在未来可能发生批量上传的时候。

  • 我定义了2个具有单向一对多关系的实体: 在command.class中: 在StockDetails.class中: null

  • 本文向大家介绍Django 多对多字段的更新和插入数据实例,包括了Django 多对多字段的更新和插入数据实例的使用技巧和注意事项,需要的朋友参考一下 表的普通字段 一对多字段 多对多字段 插入数据 表的普通字段 一对多字段 多对多字段 修改数据 补充知识:Django的ManyToManyField(多对多)的使用以及through的作用 创建一个经典的多对多关系:一本书可以有多个作者,一个作者

  • 主要内容:使用 MySQLi 和 PDO 向 MySQL 插入多条数据,实例 (MySQLi - 面向对象),实例 (MySQLi - 面向过程),实例 (PDO),使用预处理语句,实例 (MySQLi 使用预处理语句)使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句。 以下实例向 "MyGuests" 表添加了三条新的记录: 实例 (MySQLi - 面向对象) <?php $servername = "loc

  • 问题内容: 我有一个类似于以下内容的插入语句: 我需要使用多个ID插入同一条语句。现在我有: 我只是必须运行此程序,还是有一个更精简的版本? 问题答案: 使用: