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)”,效果非常好。。。非常感谢。