Python 使用SQLAlchemy在关联表中插入数据时的IntegrityError

Python 使用SQLAlchemy在关联表中插入数据时的IntegrityError,python,sqlalchemy,Python,Sqlalchemy,我正在尝试在此关联表中插入角色数据: class Association(db.Model): __tablename__ = 'associations' user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) team_id = db.Column(db.Integer, db.ForeignKey('teams.id'), primary_key=True) r

我正在尝试在此关联表中插入角色数据:

class Association(db.Model):
    __tablename__ = 'associations'
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
    team_id = db.Column(db.Integer, db.ForeignKey('teams.id'), primary_key=True)
    role = db.Column(db.String)
    user = db.relationship("User", back_populates="teams")
    team = db.relationship("Team", back_populates="users")
t = Team.query.filter_by(id=team_name1_id).first()
a = Association(role=form.role.data)
a.user = User.query.filter_by(id=current_user.id).first()
t.users.append(a)
db.session.add(t)
db.session.commit()
它链接到其他两个表:

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String)
    username = db.Column(db.String, nullable=False, unique=True, index=True)
    password_hash = db.Column(db.String)
    teams = db.relationship("Association", back_populates="user")

class Team(db.Model):
    __tablename__ = 'teams'
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String)
    player = db.Column(db.String)
    users = db.relationship("Association", back_populates="team")
但是,当我尝试在关联表中插入角色时:

class Association(db.Model):
    __tablename__ = 'associations'
    user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
    team_id = db.Column(db.Integer, db.ForeignKey('teams.id'), primary_key=True)
    role = db.Column(db.String)
    user = db.relationship("User", back_populates="teams")
    team = db.relationship("Team", back_populates="users")
t = Team.query.filter_by(id=team_name1_id).first()
a = Association(role=form.role.data)
a.user = User.query.filter_by(id=current_user.id).first()
t.users.append(a)
db.session.add(t)
db.session.commit()
我得到这个错误:

IntegrityError:(作为调用自动刷新的查询的结果而引发; 如果发生这种刷新,请考虑使用SSENSC.NOAAutoFLUH块。 过早地)(sqlite3.IntegrityError)NOT NULL约束失败: association.team_id[SQL:u'插入关联(用户_id,角色) 数值(?,)][参数:(1,u型控球后卫]]

您知道如何修复它吗?

导致故障的线路是

您尚未定义,因此它们默认为。由于您是第一次访问
Team.users
relationship属性,因此它将发出SELECT以获取相关对象

您还间接地在中更改了会话

a.user = User.query.filter_by(id=current_user.id).first()
默认情况下,这会将新的
关联
实例也放置到会话中

为了使数据库和会话的状态保持一致,SQLAlchemy必须在发出查询之前更改数据库,因此半初始化的
关联在与
团队
实例关联之前发送到数据库

可能的解决办法:

  • 对于该特定追加,因为您知道要添加新的
    关联

    with db.session.no_autoflush:
        t.users.append(a)
    
    不过,SELECT仍将发出

  • 反向操作。不要将
    关联
    实例附加到
    团队.用户
    集合,而是将
    团队
    分配给
    关联.团队

    # Instead of t.users.append(a):
    a.team = t  # Mr.
    
  • 一个不太明显的解决方案是在获取
    Team
    实例时处理关系的内容,这样就不需要选择:

    t = db.session.query(Team).options(db.joinedload(Team.users)).first()
    
    或者根本不使用该选项加载它们

  • 注意

    db.session.add(t)
    
    这是多余的。获取的
    Team
    实例已在会话中–否则,首先是
    Team.users的延迟加载。

    导致

    您尚未定义,因此它们默认为。由于您是第一次访问
    Team.users
    relationship属性,因此它将发出SELECT以获取相关对象

    您还间接地在中更改了会话

    a.user = User.query.filter_by(id=current_user.id).first()
    
    默认情况下,这会将新的
    关联
    实例也放置到会话中

    为了使数据库和会话的状态保持一致,SQLAlchemy必须在发出查询之前更改数据库,因此半初始化的
    关联在与
    团队
    实例关联之前发送到数据库

    可能的解决办法:

  • 对于该特定追加,因为您知道要添加新的
    关联

    with db.session.no_autoflush:
        t.users.append(a)
    
    不过,SELECT仍将发出

  • 反向操作。不要将
    关联
    实例附加到
    团队.用户
    集合,而是将
    团队
    分配给
    关联.团队

    # Instead of t.users.append(a):
    a.team = t  # Mr.
    
  • 一个不太明显的解决方案是在获取
    Team
    实例时处理关系的内容,这样就不需要选择:

    t = db.session.query(Team).options(db.joinedload(Team.users)).first()
    
    或者根本不使用该选项加载它们

  • 注意

    db.session.add(t)
    
    这是多余的。获取的
    Team
    实例已经在会话中,否则首先会延迟加载
    Team.users

    Related:Related:I用“a.Team=t”替换“t.users.append(a)”,效果非常好。。。非常感谢。我用“a.team=t”替换了“t.users.append(a)”,效果非常好。。。非常感谢。