pymysql 事务中的外码约束问题

2024-01-03 16:32

本文主要是介绍pymysql 事务中的外码约束问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题
  1. 首先自己写了个事务内执行多个sql的包装函数,使得这些sql的操作具有原子性,中间任意一条操作出现错误都会抛出异常并回退。
   # 更新数据,可以执行数据的增、删、改...def update_data(self, sqls: list):connect = self.__get_connect()cursor = connect.cursor()try:for sql in sqls:cursor.execute(sql)connect.commit()except Exception:# 出现异常则回滚,并抛出异常connect.rollback()raisefinally:cursor.close()connect.close()
  1. 然后在执行下边的sqls时出现了异常
"""scheme
CREATE table1 (id: INTEGER PRIMARY KEY
);
CREATE table2 (id: INTEGER PRIMARY KEY,foreign_id: INTEGER ,FOREIGN KEY(foreign_id) REFERENCES table1(id)
);
"""
sqls = ['INSERT INTO table1(id) VALUES(1);','INSERT INTO table2(id, foreign_id) VALUES(1, 1);'
]
update_data(sqls)# >>> 异常(1452, 'Cannot add or update a child row: a foreign key constraint fails ...')
  1. 违反外码约束?也就是说,在事务内,execute(sql)后缓存区的新插入数据若未commit是不能被下一条sql获取的么…
解决方法

经过一番瞎试,找到了以下的应对方法,在execute(sql)fetch一下

   # 更新数据,可以执行数据的增、删、改...def update_data(self, sqls: list):connect = self.__get_connect()cursor = connect.cursor()try:for sql in sqls:cursor.execute(sql)cursor.fetchone()	# 解决方法connect.commit()except Exception:# 出现异常则回滚,并抛出异常connect.rollback()raisefinally:cursor.close()connect.close()
  • 看了官网文档以及网上的一些fetch方法的介绍,由于我python跟mysql也不是很熟悉,还是没找到fetch能解决这个问题的原因
  • 我自己考虑的是,pymysql事务的缓存机制中,缓存区也有两个部分,一个部分是准备就绪的数据,这些数据经过了处理,比较符合mysql数据库规范,即将commit到数据库中,此时能被事务中的其他操作获取另一部分的数据还未准备就绪,仍未进行规范化处理,不能被事务中的其他操作获取。分区的目的也显而易见,准备就绪的数据在进行规范化时是比较耗时的。execute后的数据默认分配到就绪区,而fetch函数则能触发数据规范化操作。
  • 大家有什么看法也欢迎指正哈!灰常感谢!

这篇关于pymysql 事务中的外码约束问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566332

相关文章

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

SpringBoot应用中出现的Full GC问题的场景与解决

《SpringBoot应用中出现的FullGC问题的场景与解决》这篇文章主要为大家详细介绍了SpringBoot应用中出现的FullGC问题的场景与解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录Full GC的原理与触发条件原理触发条件对Spring Boot应用的影响示例代码优化建议结论F

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Pyserial设置缓冲区大小失败的问题解决

《Pyserial设置缓冲区大小失败的问题解决》本文主要介绍了Pyserial设置缓冲区大小失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录问题描述原因分析解决方案问题描述使用set_buffer_size()设置缓冲区大小后,buf

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.