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

Posted

技术标签:

【中文标题】在 PostgreSQL Flask 中删除具有外键的行【英文标题】:Delete rows with foreign key in PostgreSQL Flask 【发布时间】:2015-04-15 08:18:55 【问题描述】:

我想从我的模型中删除一行,其中包含带有 postgresql 的 ForeignKey。但是我收到了这个错误:

IntegrityError:(IntegrityError)更新或删除表“users”违反了表“users”上的外键约束“users_bestfriend_id_fkey” 详细信息:键 (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】:

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

你应该为你的bestfriend_id属性指定ondelete约束为SET NULL,所以当一个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 question 或documentation 以了解有关参照完整性约束类型的更多信息。

希望这会有所帮助。

【讨论】:

应该是 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; @ozgur thnx 为您提供帮助

以上是关于在 PostgreSQL Flask 中删除具有外键的行的主要内容,如果未能解决你的问题,请参考以下文章

postgresql:具有外键的多个多列索引?

如何使用 Flask-SQLAlchemy 使用 csv 填充具有外键的模型?

完整性错误:更新或删除违反外键约束。 Django + PostgreSQL

删除具有在 postgreSQL 中指定的模式的表列表

PostgreSQL,删除具有重新编号列值的行

使用带有外键约束的 JPA 删除对象