遇到的问题

1、pymysql.err.ProgrammingError: execute() first

2、File "D:\xxx\python3.8\lib\site-packages\pymysql\connections.py", line 729, in _read_bytes

self._sock.settimeout(self._read_timeout)

AttributeError: 'NoneType' object has no attribute 'settimeout'

原因

封装的pymysql方法,是针对单线程访问,查询等查找,并设置共享连接和游标,多个线程创建数据库连接时,就会出现问题

import pymysql

def connect(self):
self.db = pymysql.connect(**self.sql_config)
self.cursor = self.db.cursor()

封装的单线程的pymysql的游标,设置为类的实例变量,可以共享,在其它线程已经执行了关闭,所以再次关闭时,就会出现问题,提示已经关闭

解决

使用支持多线程的DButils来操作pymysql

DBUtils 是一套用于管理数据库连接池的Python包,为高频度高并发的数据库访问提供更好的性能,可以自动管理连接对象的创建和释放。并允许对非线程安全的数据库接口进行线程安全包装。

DBUtils提供两种外部接口:

PersistentDB :提供线程专用的数据库连接,并自动管理连接。

PooledDB :提供线程间可共享的数据库连接,并自动管理连接。把连接放回连接池而不是真正的关闭

DButils:不仅仅支持pymysql

参考链接:https://blog.csdn.net/weixin_42176112/article/details/109827843

使用DButils管理连接池,操作数据库,遇到的问题

PooledDB:配置连接池,提供共享数据库连接时,将连接和游标设置为类的实例变量,导致多线程执行,获取到的共享的连接和游标,导致第一次查询之后,会将设置为共享实例变量的pool_db和pool_cursor放回连接池,这时候再获取,就会报错

解决方法: 不共享连接和游标,直接返回连接和游标使用,可看下面的完整代码

错误解析可参考:https://blog.csdn.net/mtj66/article/details/125501757

python多线程读取pymysql: https://www.cnblogs.com/liwxmyself/p/15366449.html

完整代码

    def mysql_connection(self):
'''
【多线程操作数据库】:创建数据库连接池,每调用一次数据,就会从连接池中取出一个进行操作,完成操作后返回给连接池
DBUtils: 允许在多线程应用和数据库之间连接的模块套件;
:return:
'''
# 连接池最大连接数
maxconnections = 8
try:
pool = PooledDB(pymysql, maxconnections, **self.sql_config) # , use_unicode = True
pool_db = pool.connection()
pool_cursor = pool_db.cursor()
return pool_db, pool_cursor
except pymysql.Error as e:
mylog.logger.exception(f"连接异常: DButils连接数据池出错,请检查: {e}")

关闭游标,关闭连接,实际将连接返回给连接池

def dbutils_colse(self, con, cursor):
try:
cursor.close()
con.close() # 将连接放回连接池
except pymysql.Error as e:
mylog.logger.error("数据库关闭失败:{0}".format(e))

同步更新查询、编辑封装的方法,使用Dbutils

    def get_data(self, sql):
pool_db, pool_cursor = self.mysql_connection()
try:
pool_cursor.execute(sql)
res = pool_cursor.fetchall() # 返回的是数组的类型
return res
except Exception as e:
mylog.logger.exception("查询数据出错,请检查{0}".format(e))
finally:
self.dbutils_colse(pool_db, pool_cursor)

pytest-parallel 多线程执行用例,访问pymysql数据库,遇到的问题的更多相关文章

  1. pytest多进程/多线程执行测试用例

    前言: 实际项目中的用例数量会非常多,几百上千:如果采用单进程串行执行的话会非常耗费时间.假设每条用例耗时2s,1000条就需要2000s $\approx$ 33min:还要加上用例加载.测试前/后 ...

  2. python--selenium多线程执行用例实例/执行多个用例

    python--selenium多线程执行用例实例/执行多个用例 我们在做selenium测试的时候呢,经常会碰到一些需要执行多个用例的情况,也就是多线 程执行py程序,我们前面讲过单个的py用例怎么 ...

  3. Python-Unittest多线程执行用例

    前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...

  4. selenium+python-unittest多线程执行用例

    前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时...那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线程 ...

  5. selenium+python自动化90-unittest多线程执行用例

    前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...

  6. unittest多线程执行用例

    前言 假设执行一条脚本(.py)用例一分钟,那么100个脚本需要100分钟,当你的用例达到一千条时需要1000分钟,也就是16个多小时... 那么如何并行运行多个.py的脚本,节省时间呢?这就用到多线 ...

  7. pytest(13)-多线程、多进程执行用例

    有些项目的测试用例较多,测试用例时需要分布式执行,缩短运行时间. pytest框架中提供可用于分布式执行测试用例的插件:pytest-parallel.pytest-xdist,接下来我们来学习这两个 ...

  8. (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。

    关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...

  9. unittest,selenium——批量,多线程执行多文档用例

    之前做过批量执行多.py文件,为了省时也做过单py文件多线程,现在做多py文件用例多线程 # coding:utf-8import unittestimport osimport timeimport ...

  10. Java 线程和多线程执行过程分析

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

随机推荐

  1. [FAQ] FastAdmin epay 微信公众号支付 JSAPI 支付必须传 openid ?

    使用 FastAdmin 的 epay 插件时,我们通过传不同的 method 决定支付方式. method=mp 时表示公众号支付,此时必须要 openid,但是插件里并没有说明如何获取. 其实这个 ...

  2. Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: "/xxx". at createRouterError 的说明和解决

    错误说明 Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: & ...

  3. github只下载某个文件或文件夹(使用GitZip插件)

    安装GitZip插件 (此安装过程需要梯子(不懂"梯子",百度一下就明白)) 1. 打开插件管理页面 方法一:打开Chrome浏览器(Edge浏览器同理),在Chrom地址栏输入c ...

  4. Python使用HTMLTestRunner运行所有用例并产生报告

    #coding:utf-8import unittestimport osimport sysimport HTMLTestRunnercase_path = os.path.join(os.path ...

  5. Swift实现判断目录下是否存在指定文件功能

    本文主要讲解以下这段名为 isDataJsonFilePathExists 的私有函数的 Swift 代码实现细节,该函数的作用是检查指定文件或文件夹是否存在,其返回值类型为 Bool 类型,如果存在 ...

  6. DNS(1) -- DNS服务及dns资源类型

    目录 1.1 DNS服务概述 1.2 DNS域名结构 1.3 DNS解析原理 1.3.1 DNS查询类型 1.3.2 解析答案 1.4 DNS资源记录类型 1.1 DNS服务概述 DNS(Domain ...

  7. java复制指定文件

    package com.cn.file; import org.junit.Test; import java.io.FileInputStream; import java.io.FileNotFo ...

  8. leaflet利用hotline实现河流差值渲染热力图

    实现效果(这里做了1条主河道和5个支流): 核心代码使用了Leaflet.hotline插件,github下载地址链接 详情见我之前整理的一篇文章介绍河流热力图 核心代码逻辑: // 处理河流数据以及 ...

  9. console小知识

    console.log(JSON.stringify(object,null,2));

  10. 解决linux家目录模板文件被删之后显示不正常的问题

    想必经常使用linux的小伙伴都遇到过下面这种情况: 下面讲解遇到这种问题之后如何解决: [root@node5 ~]# rm -rf /home/elk/.bash* [root@node5 ~]# ...