关于executemany()方法在不同OS和DB API下的不同…

2019-01-11 08:35:29来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

昨天在参照着网上写一段关于MySQL连接池的配合gevent多线程调用的代码时遇到了一个问题,自己写的代码根本不能多线程执行,比单会话插入数据慢太多,直到今天早上才发现问题所在,把DB API从MySQLdb换为pymysql之后得到解决,因此测试了一下不同DB API和OS下executemany()的表现,先贴一下剪短的测试代码:

# -*- coding: utf-8 -*-
import MySQLdb
import pymysql
import time
conn=pymysql.connect(host='192.168.1.174',port=3306,user='leo',passwd='leo',db='leo',charset='utf8')
conn.autocommit(True)
start_time=time.time()
with conn as cursor:
    data=((i,"Messi%s"%i) for i in range(10000))
    cursor.executemany("Insert into test values(%s,%s);",data)
    cursor.execute("select count(*) from test;")
    print(cursor.fetchall())
print("Elapsed Time: ",(time.time()-start_time))

以上一段代码在Python2、3通用,通过开启general log来观察SQL和事务状态。

使用不同版本的解释器执行测试的结果如下:

其他db api诸如sqlalchemy等未进行测试。

其实之前忘了在哪里也看到过在python3中mysqlclient、MySQLdb之间的关系,但是如此混乱的版本表现确实很恶心。

此外,在Python2中如果将executemany()封装入连接池类中,表现又有所不同,多条sql会在同一个会话中分为多个事务依次执行。

总结起来暂时就一句话:尽量使用python3的MySQLdb module。

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:让Python带你看一场唯美的横飘雪!

下一篇:python并发编程(守护进程,进程锁,进程队列)