【发布时间】:2018-08-13 23:42:19
【问题描述】:
我知道有很多关于标题错误的问题,但我找不到合适的解决方案。我的问题是,当使用Session.delete() 删除一行时,它会抛出
sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1451, 'Cannot delete or update a parent row: a foreign key constraint fails (`transport`.`driver`, CONSTRAINT `driver_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `truckcompany` (`id`))') [SQL: 'DELETE FROM truckcompany WHERE truckcompany.id = %(id)s'] [parameters: {'id': 4}]
型号:
class Truck_company(Base):
__tablename__ = 'truckcompany'
id = Column(BigInteger, primary_key=True)
class Driver(Base):
__tablename__ = 'driver'
id = Column(BigInteger, primary_key=True)
owner_id = Column(BigInteger, ForeignKey('truckcompany.id'))
owner = relationship(Truck_company)
删除失败的视图:
@app.route('/values/deleteuser/<int:id>', methods=['POST', 'GET'])
def delete_truck(id):
value_truckcompany = sqlsession.query(Truck_company).filter(Truck_company.id == id).first()
if value_truckcompany:
sqlsession.delete(value_truckcompany)
sqlsession.commit()
return redirect('/static/truckcompanyview', )
【问题讨论】:
-
我想你还有一张表是指卡车公司表?
-
可以举个例子。
-
仔细阅读错误。
driver中有一行引用了truckcompany中您要删除的行。您必须考虑在这种情况下您希望发生什么。还要删除驱动程序吗?或者将他们的owner_id设置为 NULL?和往常一样,提供minimal reproducible example。例如,您遗漏了您的驱动程序模型。通常,如果您包含您正在使用的数据库,它也会有所帮助,尽管在这种情况下,从错误消息中可以明显看出。 -
我刚刚更新了 orm.py,如果你现在帮我,先生。
-
至于为什么会发生这种情况:"For an ON DELETE or ON UPDATE that is not specified, the default action is always RESTRICT. " 要么更改 DB 外键约束以使用 ON DELETE CASCADE 并修改您的 SQLA 模型以反映这一点,手动删除与
Truck_company相关的Drivers要删除,或使用 SQLA 级联(您已经尝试过)。
标签: python flask sqlalchemy