在 PostgreSQL Flask 中删除带有外键的行
Delete rows with foreign key in PostgreSQL Flask
我想从我的模型中删除一行,该行具有带有 postgresql 的 ForeignKey。但是我得到了这个错误:
IntegrityError: (IntegrityError) update or delete on table "users" violates foreign key constraint "users_bestfriend_id_fkey" on table "users" DETAIL: Key (id)=(3) is still referenced from table "users". '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'))
documentation 非常清楚如何在 SQLAlchemy 中为列指定完整性约束。
您应该为您的 bestfriend_id
属性指定 ondelete
约束为 SET NULL
,因此当 user
从 table 中删除时,他的朋友不应该不会和他一起被删
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 or the documentation 以获取有关引用完整性约束类型的更多信息。
希望对您有所帮助。
我想从我的模型中删除一行,该行具有带有 postgresql 的 ForeignKey。但是我得到了这个错误:
IntegrityError: (IntegrityError) update or delete on table "users" violates foreign key constraint "users_bestfriend_id_fkey" on table "users" DETAIL: Key (id)=(3) is still referenced from table "users". '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'))
documentation 非常清楚如何在 SQLAlchemy 中为列指定完整性约束。
您应该为您的 bestfriend_id
属性指定 ondelete
约束为 SET NULL
,因此当 user
从 table 中删除时,他的朋友不应该不会和他一起被删
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 or the documentation 以获取有关引用完整性约束类型的更多信息。
希望对您有所帮助。