MySQL临时表在Python调用过程中的生命周期

news2024/12/27 2:21:30

MySQL临时表在Python调用过程中的生命周期

1. 需求

在MySQL数据库中,通过存储过程调用,查询结果集放在一个临时表中,提供给Python使用。临时表的会话周期在Python有效期是由db对象还是cursor对象决定的。

2.存储过程

把用户信息放在临时表中,通过参数定义临时表名。

CREATE DEFINER=`root`@`%` PROCEDURE `pro_temp_life`(in tablename varchar(20),out v_result int )
begin  

		set @sql_txt = concat('create temporary table ',tablename,' as  select user, host from mysql.user;');
    -- 动态构建的SQL语句
		prepare pre_sql from @sql_txt;  
		-- 执行准备好的查询
    execute pre_sql; 

		set @sql_txt = concat('select count(*) into @tmp_count from ',tablename,' ;') ;
    -- 动态构建的SQL语句
		prepare pre_sql from @sql_txt;  
		-- 执行准备好的查询
    execute pre_sql; 
		
		set v_result = @tmp_count;

		-- 释放查询语句对象资源	
    deallocate prepare pre_sql; 
 
end
3.Python 调用测试
(1)测试情况1
global_db = pymysql.connect(**common_env.global_config)
global_cursor = global_db.cursor()
# [0]参数1 [1]参数2
condition=['TcbRWFwG',0]
global_cursor.callproc('pro_temp_life', condition)
print('condition:',condition[1])
global_cursor.execute('select * from ' + condition[0] + ';')  
result = global_cursor.fetchall()
for r in result :
    print(r)
    
global_cursor.close()
global_db.close()

执行结果:

condition: 0
('root', '%')
('mysql.infoschema', 'localhost')
('mysql.session', 'localhost')
('mysql.sys', 'localhost')
('root', 'localhost')

说明:
没有能返回存储过程的返回值,是因为pymysql 模块的原因。再以前的文章中测试验证过,不做赘述。
在cursor调用存储过程后,再执行select ,临时表在MySQL数据库的会话中存在。

(2)测试情况2
global_db = pymysql.connect(**common_env.global_config)
global_cursor = global_db.cursor()
# [0]参数1 [1]参数2
condition=['TcbRWFwG',0]
global_cursor.callproc('pro_temp_life', condition)
print('condition:',condition[1])
global_cursor.execute('select * from ' + condition[0] + ';')  
result = global_cursor.fetchall()
for r in result :
    print(r)

#  关闭cursor
global_cursor.close()
global_cursor = global_db.cursor()

global_cursor.execute('select * from ' + condition[0] + ';')  
result = global_cursor.fetchall()
for r in result :
    print(r)

global_db.close()

结果:

condition: 0
('root', '%')
('mysql.infoschema', 'localhost')
('mysql.session', 'localhost')
('mysql.sys', 'localhost')
('root', 'localhost')
('root', '%')
('mysql.infoschema', 'localhost')
('mysql.session', 'localhost')
('mysql.sys', 'localhost')
('root', 'localhost')

说明:
关闭curosr后,再次打开cursor ,查询临时表,临时表还存在,说明会话生命周期比cursor长。

(3)测试情况3
global_db = pymysql.connect(**common_env.global_config)
global_cursor = global_db.cursor()
# [0]参数1 [1]参数2
condition=['TcbRWFwG',0]
global_cursor.callproc('pro_temp_life', condition)
print('condition:',condition[1])
global_cursor.execute('select * from ' + condition[0] + ';')  
result = global_cursor.fetchall()
for r in result :
    print(r)

#  关闭cursor db
global_cursor.close()
global_db.close()

global_db = pymysql.connect(**common_env.global_config)
global_cursor = global_db.cursor()

global_cursor.execute('select * from ' + condition[0] + ';')  
result = global_cursor.fetchall()
for r in result :
    print(r)

global_db.close()

结果:

condition: 0
('root', '%')
('mysql.infoschema', 'localhost')
('mysql.session', 'localhost')
('mysql.sys', 'localhost')
('root', 'localhost')

ProgrammingError: (1146, "Table 'mysql.TcbRWFwG' doesn't exist")
4. 结论

MySQL的临时表的生命周期,在Python调用过程中,可以看到MySQL临时表生命周期是和db对象一致,如果db对象关闭后,临时表也就不存在了。如果db对象不关闭,只关闭cursor对象,再次打开cursor ,MySQL的会话没有结束,临时表对象还存在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2251989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

江协科技最新OLED保姆级移植hal库

江协科技最新OLED移植到hal库保姆级步骤 源码工程存档 工程和源码下载(密码 1i8y) 原因 江协科技的开源OLED封装的非常完美, 可以满足我们日常的大部分开发, 如果可以用在hal库 ,将是如虎添翼, 为我们开发调试又增加一个新的瑞士军刀, 所以我们接下来手把手的去官网移植源码…

HarmonyOS:使用Emitter进行线程间通信

Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。 一、Emitter的开发步骤如下: 订阅事件 import { emitter } from kit.BasicServicesKit; import { promptAction } from kit.…

Wi-Fi 进化论:从过去到未来(6/10)

Wi-Fi(发音: /ˈwaɪfaɪ/),在中文里又称作“移动热点”,是Wi-Fi联盟制造商的商标作为产品的品牌认证,是基于IEEE 802.11标准的无线局域网通信技术 [6]。基于两套系统的密切相关,也常有人把Wi-F…

【C++初阶】第5课—动态内存管理

文章目录 1. 内存分布2. C语言动态内存管理3. C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new和operator delete函数5. new和delete的实现原理6. malloc/free和new/delete的区别7. 定位new表达式(了解即可) 1. 内存分布 先来做一个关于…

学习threejs,设置envMap环境贴图创建反光效果

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.CubeTextureLoader 立…

Matlab Simulink HDL Coder FPGA开发初体验—计数器

目录 一、Simulink设计及仿真二、Verilog HDL代码转换1、参数配置2、HDL代码生成 三、ModelSim仿真分析1、使用自己编写的Testbench文件进行仿真2、使用HDL Coder生成的Testbench文件进行仿真 前言 Simulink HDL Coder‌是一款将Simulink和Stateflow模型转化为可综合的Verilog和…

【C语言】扫雷游戏(一)

我们先设计一个简单的9*9棋盘并有10个雷的扫雷游戏。 1,可以用数组存放,如果有雷就用1表示,没雷就用0表示。 2,排查(2,5)这个坐标时,我们访问周围的⼀圈8个位置黄色统计周围雷的个数是1。排查(8,6)这个坐标时&#xf…

实现点名神器的pyqt6实现

利用python gui创建点名神器,包含加分、导出加分记录、清除加分记录。 点名页面 首先导入学生信息 导入成功 开始点名 点击停止 点过之后,点击加分 加完分 查看加分记录 可以直接进入导出记录和清除历史。 此文到此结束,想要源码的请私聊我&a…

【UE5 C++】判断两点连线是否穿过球体

目录 前言 原理 代码 测试 结果 前言 通过数学原理判断空间中任意两点的连线是否穿过球体,再通过射线检测检验算法的正确性。 原理 (1)设球体球心的坐标为 ,半径为r; (2)设线段中A点的坐…

【AI】数据,算力,算法和应用(3)

三、算法 算法这个词,我们都不陌生。 从接触计算机,就知道有“算法”这样一个神秘的名词存在。象征着专业、权威、神秘、高难等等。 算法是一组有序的解决问题的规则和指令,用于解决特定问题的一系列步骤。算法可以被看作是解决问题的方法…

计算机的错误计算(一百七十一)

摘要 探讨 MATLAB 中秦九韶(Horner)多项式的错误计算。 例1. 用秦九韶(Horner)算法计算(一百零七)例1中多项式 直接贴图吧: 这样,MATLAB 给出的仍然是错误结果,因为准…

Ubuntu20.04运行R-VIO2

目录 1.环境配置2.构建项目3. 运行 VIO 模式4.结果图 1.环境配置 CMakeLists.txt中 C 使用 14、opencv使用4 2.构建项目 克隆代码库: 在终端中执行以下命令克隆项目:git clone https://github.com/rpng/R-VIO2.git编译项目: 使用 catkin_m…

【Maven系列】深入解析 Maven 常用命令

前言 在当今的软件开发过程中,项目管理是至关重要的一环。项目管理包括了项目构建、依赖管理以及发布部署等诸多方面。而在Java生态系统中,Maven已经成为了最受欢迎的项目管理工具之一。Maven 是一套用于构建、依赖管理和项目管理的工具,主要…

深度学习的python基础(1)

一.tensor创建 1.张量的定义 张量在形式上就是多维数组,例如标量就是0维张量,向量就是一维张量,矩阵就是二维张量,而三维张量就可以想象RGB图片,每个channel是一个二维的矩阵,共有三个channel&#xff0…

【Python爬虫实战】轻量级爬虫利器:DrissionPage之SessionPage与WebPage模块详解

🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、SessionPage (一)SessionPage 模块的基本功能 (二)基本使…

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令(补充) shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令(补充) …

Vue进阶之单组件开发与组件通信

书接上篇,我们了解了如何快速创建一个脚手架,现在我们来学习如何基于vite创建属于自己的脚手架。在创建一个新的组件时,要在新建文件夹中打开终端创建一个基本的脚手架,可在脚手架中原有的文件中修改或在相应路径重新创建&#xf…

Webman中实现定时任务

文章目录 Webman中实现定时任务一、引言二、安装与配置1、安装Crontab组件2、创建进程文件3、配置进程文件随Webman启动4、重启Webman5、Cron表达式(补充)例子 三、使用示例四、总结 Webman中实现定时任务 一、引言 在现代的后端开发中,定时…

Android笔记(三十四):封装带省略号图标结尾的TextView

背景 项目需求需要实现在文本末尾显示一个icon,如果文本很长时则在省略号后面显示icon,使用TextView自带的drawableEnd可以实现,但是如果文本换行了则会显示在TextView垂直居中的位置,不满足要求,于是有了本篇的自定义…

多线程篇-8--线程安全(死锁,常用保障安全的方法,安全容器,原子类,Fork/Join框架等)

1、线程安全和不安全定义 (1)、线程安全 线程安全是指一个类或方法在被多个线程访问的情况下可以正确得到结果,不会出现数据不一致或其他错误行为。 线程安全的条件 1、原子性(Atomicity) 多个操作要么全部完成&a…