flask-sqlalchemy事务引发的若干个问题思考

2023-11-09

一、首先要明白flush和commit区别:

      > flush: 写数据库,但不提交,也就是事务未结束

      > commit: sqlalchemy会自动创建隐私的事务,先调用flush写数据库,然后提交,结束事务,并开始新的事务

 

二、对db.session.flush进行探索(现有两张表,一主一外)

class OrderInfo(db.Model):
    """订单表"""

    __tablename__ = "order_info"

    order_id = db.Column(db.String(128), primary_key=True)  # 订单id
    total_count = db.Column(db.Integer, default=1)  # 商品数量
    total_price = db.Column(db.Numeric(10, 2))  # 商品总价
    transit_price = db.Column(db.Numeric(10, 2))  # 订单运费


class OrderGoods(db.Model):
    """订单商品表"""

    __tablename__ = "order_goods"

    id = db.Column(db.Integer, primary_key=True)
    order = db.Column(db.String(128), db.ForeignKey('order_info.order_id'))  # 订单ID
    count = db.Column(db.Integer, default=1)  # 商品数目
    price = db.Column(db.Numeric(10, 2))  # 商品价格
    comment = db.Column(db.Text, default='')  # 商品评论
  • 创建数据order=OrderInfo(order_id='1', total_price=0, transit_price)  
  • 这时候 order.字段名 是可以查询到属性的,不需要db.session.add(order)和db.session.flush(), 我查资料时有人说不add和flush不能查询到相应字段数据,我这里实操可以。
  • 我再创建goods = OrderGoods(order=1, price=1),这时候报错外键约束,原因是找不到order,这时候加上db.session.add(order)和db.session.flush()成功。 说明这里已经写到数据库,我当时对写入数据库有点误解,我以为select * from xxx后可以查到数据,但这里的写入应该理解成在python程序中能够正常调用刚才创建的数据,数据库并无法查询到。
  • 这时候我去msyql删除表delete from orer_goods,mysql报错:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction。 这里的原因是因为:使用db.session.flush()后,mysql事务开始了,但未结束,此时需要手动结束rollback或db.session.commit()。这样一个事务结束。
  • 关于mysql这个报错具体还可了解:https://blog.csdn.net/zhaofuqiangmycomm/article/details/82150815

 

三、db.session.flush()后会不会覆盖:

order=OrderInfo(order_id='1', total_price=0, transit_price) 
db.session.add(order)
db.session.flush()
for i in range(5):
    if i > 2:
        return jsonify({'errmsg': '错误信息'})
    
    # 两次 
    goods = OrderGoods(order=i, price=i)
    db.session.add(goods)
    db.session.flush()

try:
    db.session.commit()
except Exception as error:
    print(error)
    db.session.rollback()

return ''

代码从上往下走,创建了一个order,进入for循环后一共flush了两次goods,假设是goods_1和goods_2,那么循环第二次时生成的goods_2是不是会覆盖掉goods_1呢?以至于循环了2次,也只是创建了一个goods,毕竟事务没有提交,没有真正写入数据库。实操发现:并不会覆盖

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flask-sqlalchemy事务引发的若干个问题思考 的相关文章

随机推荐

  • 不平衡数据处理技术——RUSBoost

    RUSBoost是一个非常简单的针对不平衡数据集的算法 算法如其名 就是RUS Boost RUS random undersampling 随机欠抽样 随机从数据集中抽取一定量的多数类样本和少数类组成平衡分布的训练数据集 Boost 指的
  • linux 给lvm磁盘扩容

    目录 linux 给lvm磁盘扩容 扩容步骤 确认可用空间 创建新的物理卷 将物理卷添加到现有的卷组中 扩展逻辑卷 linux 给lvm磁盘扩容 早上到公司发现磁盘满了 挂载点是一个lvm 跟领导确认后决定先扩容再清理 原先是1T 决定扩容
  • oRACLE错误怎么办,Oracle的常见错误及解决办法

    ORA 12528 TNS listener all appropriate instances are blocking new connections ORA 12528问题是因为监听中的服务使用了动态服务 实例虽然启动 但没有注册到监
  • 解决adbd cannot run as root in production builds问题

    1 验证你的手机是否已经root了 adb shell su 行命令后 变为 即 表示root 成功 2 安装adbd insecure apk adb install adbd insecure apk 3 设置 打开应用将Enable
  • 集成公告|多链NFT游戏Blockchain Monster Hunt即将上线Moonbeam

    用户现可在Moonbase Alpha测试网体验Blockchain Monster Hunt游戏 并计划将于明年Moonbeam启动后上线Moonbeam平台 Moonbeam宣布支持多链NFT游戏Blockchain Monster H
  • 【弱网测试】

    弱网测试简介 1 测试方法及工具 随着互联网的快速发展 越来越多的应用核心功能需要联网实现 现在的网络制式有2G 3G 4G 5G 还有越来越多的公众WiFi 不同的网络环境和网络制式的差异都会对用户使用APP造成一定的影响 弱网测试作为健
  • [Codeforces 1579G] Minimal Coverage

    You are given n lengths of segments that need to be placed on an infinite axis with coordinates The first segment is pla
  • 爬虫获取电影数据----以沈腾参演电影为例

    数据可视化 分析实战 1 1 沈腾参演电影数据获取 1 2 电影数据可视化分析 文章目录 数据可视化 分析实战 前言 1 网页分析 2 构建数据获取函数 2 1 网页数据获取函数 2 2 网页照片获取函数 3 获取参演影视作品基本数据 4
  • Linux的c编程-文件节点的打开与读写操作

    1 open 打开文件 相关函数 read write fcntl close link stat umask unlink fopen 表头文件 include
  • Python实现简单爬虫功能

    在我们日常上网浏览网页的时候 经常会看到一些好看的图片 我们就希望把这些图片保存下载 或者用户用来做桌面壁纸 或者用来做设计的素材 我们最常规的做法就是通过鼠标右键 选择另存为 但有些图片鼠标右键的时候并没有另存为选项 还有办法就通过就是通
  • 如何用php请求gpt接口

    定义GPT接口地址和参数 url https api openai com v1 completions data array prompt gt Once upon a time max tokens gt 5 temperature g
  • 清除HTML的超链接样式,Markdown导出HTML,删除超链接下划线和字体样式

    使用Markdown生成的HTML含有超链接的下划线 如下图 将Markdown导出的HTML文件放置在Blog文章中时 Markdown文件的超链接下划线样式会影响整个页面的超链接下划线样式 如下图 修改方法是 将Markdown导出的H
  • Quaternion.Euler(0, 90, 0)*Vector3(0.0, 0.0, -10)

    Quaternion Euler x y z 返回一个绕x轴旋转x度再绕y轴旋转y度再绕z轴旋转z度的Quaternion 因此Quaternion Euler 0 90 0 返回一个绕y轴旋转90度的旋转操作 Quaternion作用于V
  • nginx 显示php错误日志,nginx php-fpm 输出php错误日志-php教程

    nginx是一个web效劳器 因而nginx的access日记只有对拜访页面的记载 没有会有php 的 error log信息 nginx把对php的申请发给php fpm fastcgi过程来解决 默许的php fpm只会输入php fp
  • 2021蓝桥杯模拟赛-删除字符

    题目 题目链接 题解 贪心 贪心思路 将整个字符串视为若干段降序排列的子串 即 从左边开始向右遍历 遇到逆序的就删除 再对新的串从头遍历找逆序 不停地重复整个过程是为了保证删除的尽可能靠前 贪心 如果整个字符串都顺序了 但是还要删 那么就从
  • 【Python计量】自相关性(序列相关性)的检验

    文章目录 一 图示法 一 滞后图 二 自相关图 三 自相关图和偏自相关图 二 DW检验法 三 Breusch Godfrey检验 一 手动编制函数进行BG检验 二 调用statsmodels的函数进行BG检验 四 Ljung Box检验 此
  • 高德地图api之location定位服务

    除了basic map外 高德地图api还提供了定位服务 兴趣点搜索服务 路线查找服务 离线地图服务 现在我们看一下api中如何使用AMaplocation定位服务 其实在android api中已经提供了android location
  • 查找子串出现的次数C/C++(strstr函数)

    任务描述 本关任务 计算一个字符串 子串 在另一个字符串 长串 中出现的次数 相关知识 字符串操作函数 C 和 C 提供了一系列操作字符串的函数 要使用这些函数只要在代码的头文件部分包含 string h 即可 这里我们用到strstr函数
  • 10. M601 HTTP例程介绍

    include
  • flask-sqlalchemy事务引发的若干个问题思考

    一 首先要明白flush和commit区别 gt flush 写数据库 但不提交 也就是事务未结束 gt commit sqlalchemy会自动创建隐私的事务 先调用flush写数据库 然后提交 结束事务 并开始新的事务 二 对db se