nival 2022-06-24 17:38 采纳率: 100%
浏览 35
已结题

SQLAlchemy在删除有外键约束的记录时,外键约束未起作用,何解?

一、环境:pyqt5+python 3.7+SQLAlchemy 1.4.36+mysql 8.0

二、相关表结构如下:

class maintenanceZone(Base):
    __tablename__ = "maintenanceZone"  # 区域信息
    __table_args__ = {
        "mysql_engine": "InnoDB",
    }

    id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True)
    cityName = sa.Column(sa.String(100), nullable=False )
    countyName = sa.Column(sa.String(100), nullable=False)



class maintainerInfo(Base):
    __tablename__ = "maintainerInfo"  #人员信息
    __table_args__ = {
        "mysql_engine": "InnoDB",
    }

    id = sa.Column(sa.Integer(), primary_key=True, autoincrement=True)
    userName = sa.Column(sa.String(100), unique=True, nullable=False, comment="人员姓名")
    userPhone = sa.Column(sa.String(20), unique=True, comment="人员联系电话")
    zoneID = sa.Column(sa.Integer(),
                       sa.ForeignKey("maintenanceZone.id", ondelete="RESTRICT",onupdate="CASCADE"), comment="区域ID")

    zoneinfo = relationship("maintenanceZone", backref=backref('maintainerInfo',order_by=id))

三、相关代码如下:

zoneOne = session.query(maintenanceZone).filter(maintenanceZone.cityName == old_city,maintenanceZone.countyName == old_country).one()
session.delete(zoneOne)
session.commit()

四、数据库engine代码如下:

dburl = "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(dbIni["user"], dbIni["password"],dbIni["host"], dbIni["port"], dbIni["db"])

engine = create_engine(
            url=dburl,
            max_overflow=0, 
            pool_size=5,
            pool_timeout=20,
            pool_recycle=-1,
        )

五、问题如下:

1、在mysql8.0中,通过sql语删除maintenanceZone表中记录时,会触发外键约束,提示无法删除;

2、在python代码中通过SQLAlchemy删除maintenanceZone表中同一记录时,没有任何提示,直接删除!

 

SQLAlchemy删除maintenanceZone表记录时,外键约束未何未生效?????

  • 写回答

1条回答 默认 最新

  • llc的足迹 2022-06-25 15:11
    关注

    maintainerInfo表中的zoneID字段nullable默认为True,删除maintenanceZone中的记录时将其设置为NULL,这是允许的。
    因此将nullable设置为False,删除的时候就会抛出约束错误了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月3日
  • 已采纳回答 6月25日
  • 创建了问题 6月24日

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口