Python 删除PostgreSQL中具有外键的行

Python 删除PostgreSQL中具有外键的行,python,database,postgresql,flask,flask-migrate,Python,Database,Postgresql,Flask,Flask Migrate,我想从模型中删除一行,该行使用postgresql具有ForeignKey。但我有一个错误: IntegrityError:(IntegrityError)表“用户”上的更新或删除违反了表“用户”详细信息上的外键约束“用户最佳朋友id”键:键(id)=(3)仍从表“用户”引用。'从用户中删除,其中users.id=%(id)s'{'id':3} 我认为要解决这个问题,我应该使用CASCADE,但我不知道如何在我的模型中使用它,所以如果您提供帮助,我将表示感谢:) model.py: frien

我想从模型中删除一行,该行使用postgresql具有ForeignKey。但我有一个错误:

IntegrityError:(IntegrityError)表“用户”上的更新或删除违反了表“用户”详细信息上的外键约束“用户最佳朋友id”键:键(id)=(3)仍从表“用户”引用。'从用户中删除,其中users.id=%(id)s'{'id':3}

我认为要解决这个问题,我应该使用CASCADE,但我不知道如何在我的模型中使用它,所以如果您提供帮助,我将表示感谢:)


model.py

friends = db.Table('friends',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('friend_id', db.Integer, db.ForeignKey('users.id'))
)

class Users(db.Model):
   id = db.Column(db.Integer, primary_key = True)
   name = db.Column(db.String(50), index=True)
   age= db.Column(db.Integer )
   email = db.Column(db.String(50),index=True, unique= True)
   bestfriend_id = db.Column(db.Integer, db.ForeignKey('users.id'))


   is_bestfriend = db.relationship( 'Users', uselist=False, remote_side=[id], post_update=True)
# delete user profile
@layout.route('/delete/<int:id>')
@login_required
def delete(id):
  user = Users.query.get_or_404(id)
  if g.user.id == user.id:
           flash('You are not allow to delete yourself.')

  else:
      db.session.delete(user)
      db.session.commit()
      flash('delete done.')
  return redirect(url_for('layout.user', id=id, page=1, sortby='normal'))
查看.py

friends = db.Table('friends',
db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
db.Column('friend_id', db.Integer, db.ForeignKey('users.id'))
)

class Users(db.Model):
   id = db.Column(db.Integer, primary_key = True)
   name = db.Column(db.String(50), index=True)
   age= db.Column(db.Integer )
   email = db.Column(db.String(50),index=True, unique= True)
   bestfriend_id = db.Column(db.Integer, db.ForeignKey('users.id'))


   is_bestfriend = db.relationship( 'Users', uselist=False, remote_side=[id], post_update=True)
# delete user profile
@layout.route('/delete/<int:id>')
@login_required
def delete(id):
  user = Users.query.get_or_404(id)
  if g.user.id == user.id:
           flash('You are not allow to delete yourself.')

  else:
      db.session.delete(user)
      db.session.commit()
      flash('delete done.')
  return redirect(url_for('layout.user', id=id, page=1, sortby='normal'))
#删除用户配置文件
@layout.route(“/delete/”)
@需要登录
def删除(id):
user=Users.query.get\u或\u 404(id)
如果g.user.id==user.id:
flash(“不允许您删除自己”。)
其他:
db.session.delete(用户)
db.session.commit()
闪存(“删除完成”。)
返回重定向(url_for('layout.user',id=id,page=1,sortby='normal'))
非常清楚如何在SQLAlchemy中为列指定完整性约束

您应该为
bestfriend\u id
属性指定
ondelete
约束为
SET NULL
,这样当从表中删除
用户
时,他的朋友不应该被删除

bestfriend_id = db.Column(db.Integer, db.ForeignKey('users.id', ondelete='SET NULL'), nullable=True)
我不知道当您对该列进行更改时,Flask是否会自动更改该列,因此我认为您也应该手动更新该列

ALTER TABLE users ALTER COLUMN users_bestfriend_id DROP NOT NULL;
ALTER TABLE users DROP CONSTRAINT users_bestfriend_id_fkey, ADD CONSTRAINT users_bestfriend_id_fkey FOREIGN KEY (bestfriend_id) REFERENCES users(id) ON DELETE SET NULL;
您希望查看此或,以获取有关引用完整性约束类型的更多信息


希望这有帮助。

应该是ALTER TABLE users ALTER COLUMN users\u bestfriend\u id DROP NOT NULL;然后ALTER TABLE users DROP CONSTRAINT users\u bestfriend\u id\u fkey,添加CONSTRAINT users\u bestfriend\u id\u fkey外键(bestfriend\u id)引用DELETE SET NULL上的users(id)@ozgur thnx寻求您的帮助