在PostgreSQL Flask中删除带有外键的行

时间:2015-02-14 08:55:50

标签: python database postgresql flask flask-migrate

我想从我的模型中删除一个带有postgresql的ForeignKey的行。但我得到了这个错误:

  

IntegrityError :( IntegrityError)更新或删除表“users”违反表“users”上的外键约束“users_bestfriend_id_fkey”DETAIL:Key(id)=(3)仍然从表中引用“用户”。 'DELETE FROM users WHERE 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)

view.py

# 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'))

1 个答案:

答案 0 :(得分:1)

documentation非常清楚如何为SQLAlchemy中的列指定完整性约束。

您应为ondelete属性指定SET NULL约束为bestfriend_id,因此当从表中删除user时,他的朋友不应与他一起删除

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;

您希望查看此SO questiondocumentation以获取有关参照完整性约束类型的更多信息。

希望这有帮助。