用Python连接MySQL数据库时,会用到MySQLdb库,这里下载↓↓↓

https://pypi.python.org/pypi/MySQL-python/

这个库提供了对数据库的普遍操作,增删改查之类的,教程可以参考:

python下的MySQLdb使用

其中,有一个很cooooooooooool的功能就是批量操作executemany,可以进行多行插入

先写sql语句。要注意的是里面的参数,不管什么类型,统一使用%s作为占位符
例如,向user表(username,salt,pwd)插入数据

sql = 'INSERT INTO 表名 VALUES(%s,%s,%s)'
对应的param是一个tuple或者list

param = ((username1, salt1, pwd1), (username2, salt2, pwd2), (username3, salt3, pwd3))

这样就包含了三条数据,通过executemany插入
n=cursor.executemany(sql,param)

上个双休日在学校往毕设系统里导名单,想到Java就心累于是用Python写

作为一个老实的土鳖,在知道有这个酷炫的方法情况下,还是有点不敢用,先保守地写了一个循环的版本

几百条数据很快就导进去的,本来这就该结束了,但是又觉得有点不甘心,想知道两种插入方式效率有多大差别

于是简单模拟了10000个用户的数据,试着用两种方法各跑了一遍

# -------------------------------------------
# Python MySQLdb 循环插入execute与批量插入executemany性能分析
# 插入数据量:10000条
# 每条字段:username, salt, pwd
# Author : Lrg
# -------------------------------------------
# encoding = utf-8
import MySQLdb
import xlrd
import time
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
 
# 从users.xls文件获取10000条用户数据
# 该文件由create_users.py生成
def get_table():
    FILE_NAME = 'users.xls'
    data = xlrd.open_workbook(FILE_NAME)
    table = data.sheets()[0]
    return table
 
# 循环插入execute    
def insert_by_loop(table):
    nrows = table.nrows
    for i in xrange(1,nrows):
        param=[]
        try:
            sql = 'INSERT INTO user values(%s,%s,%s)'
            # 第一列username,第二列salt,第三列pwd
            print 'Insert: ',table.cell(i, 0).value, table.cell(i, 1).value, table.cell(i, 2).value
            param = (table.cell(i, 0).value, table.cell(i, 1).value, table.cell(i, 2).value)
            # 单条插入
            cur.execute(sql, param)
            conn.commit()
        except Exception as e:
            print e
            conn.rollback()
    print '[insert_by_loop execute] total:',nrows-1
 
# 批量插入executemany
def insert_by_many(table):
    nrows = table.nrows
    param=[]
    for i in xrange(1,nrows):
        # 第一列username,第二列salt,第三列pwd
        param.append([table.cell(i, 0).value, table.cell(i, 1).value, table.cell(i, 2).value])
    try:
        sql = 'INSERT INTO user values(%s,%s,%s)'
        # 批量插入
        cur.executemany(sql, param)
        conn.commit()
    except Exception as e:
        print e
        conn.rollback()    
    print '[insert_by_many executemany] total:',nrows-1    
 
 
# 连接数据库
conn = MySQLdb.connect(host="127.0.0.1", port=3306, user="lrg", passwd="lrg", db="pythontest")
cur = conn.cursor()
 
# 新建数据库
cur.execute('DROP TABLE IF EXISTS user')
sql = """CREATE TABLE user(
        username CHAR(255) NOT NULL,
        salt CHAR(255),
        pwd CHAR(255)
        )"""
cur.execute(sql)
 
# 从excel文件获取数据
table = get_table()
 
# 使用循环插入
start = time.clock()
insert_by_loop(table)
end = time.clock()
print '[insert_by_loop execute] Time Usage:',end-start
 
# 使用批量插入
start = time.clock()
insert_by_many(table)
end = time.clock()
print '[insert_by_many executemany] Time Usage:',end-start
 
# 释放数据连接
if cur:
    cur.close()
if conn:
    conn.close()

一共10000条数据

一行行循环execute,耗时200秒左右(下面244秒的数据是每次循环加了输出语句的,应该有点影响)

而用executemany一次提交全部,耗时只有0.86秒……

[insert_by_loop execute] total: 10000
[insert_by_loop execute] Time Usage: 244.164735527
[insert_by_many executemany] total: 10000
[insert_by_many executemany] Time Usage: 0.861406346583
[Finished in 245.7s]

土鳖现在有一种难以言喻的微妙感
想起前两天用正则表达式用的正爽时,看到一篇文章说,同样的功能用字符串函数完成比正则快几十几百倍……

讨厌啦泥们不要欺负新手啊!!【捂脸】

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

附上生成模拟数据user.xls的代码,简单粗暴(MD5部分实验程序:Python简单密码加密程序,加盐(salt)md5)

# -------------------------------------------
# Python生成user程序
# Author : Lrg
# -------------------------------------------
# encoding = utf-8
from random import Random
from hashlib import md5
import xlwt
 
# 获取由4位随机大小写字母、数字组成的salt值
def create_salt(length = 4):
    salt = ''
    chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    len_chars = len(chars) - 1
    random = Random()
    for i in xrange(length):
        # 每次从chars中随机取一位
        salt += chars[random.randint(0, len_chars)]
    return salt
 
# 获取原始密码+salt的md5值
def create_md5(pwd,salt):
    md5_obj = md5()
    md5_obj.update(pwd + salt)
    return md5_obj.hexdigest()
 
# 创建一个xls文件
book = xlwt.Workbook()
# 创建一个sheet
sheet = book.add_sheet('users', cell_overwrite_ok=True)
# 每列第一行写上列名
sheet.write(0, 0, 'username')
sheet.write(0, 1, 'salt')
sheet.write(0, 2, 'pwd')
# 生成user数量
count = 10000
# 第一个id
first_id = 311010000
for i in xrange(count):
    current_id = str(first_id + i)
    salt = create_salt()
    pwd = create_md5(current_id, salt)
    sheet.write(i+1, 0, current_id)
    sheet.write(i+1, 1, salt)
    sheet.write(i+1, 2, pwd)
# 保存
book.save('users.xls')

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

过了一天,又学到一个打脸方法

MySQL本身有个load data infile的方法,格式类似这样:

load data infile 'D:/Python workspace/user.txt' into table user(username, salt, pwd)

这个方法有多快?
从txt导5个字段的9086条数据到mysql,先读到程序里,再用executemany是0.29秒,直接用这个语句导的话,0.17秒……

想到昨天一个上午都在磨磨唧唧研究循环跟批量,这下被打脸也是打的有点爽……
————————————————
版权声明:本文为CSDN博主「尾巴七」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/colourless/article/details/41444069

Python MySQLdb 循环插入execute与批量插入executemany性能分析(list批量写法亲测成功)相关推荐

  1. python遇到天猫反爬虫_selenium 淘宝登入反爬虫解决方案(亲测有效)

    前言 目前在对淘宝进行数据爬取的时候都会碰到,登入时的滑块问题,无论是手动还是脚本都不成功.这里的很重要一个原因是很多的网站都对selenium做了反爬虫机制.接下来是笔者参考网上的网友们的方法亲自测 ...

  2. 用python自动化定时发送邮件(普通文本,html,图片,附件等)_亲测有效

    这周有需求将Bi报表每天定时,自动的群发给team成员,今天搜集资料完成了这个需求,可以发送普通文本,图片,附件已经html形式将其展现出来,整套代码如下:已亲测可行,相关信息已脱敏~ 写完脚本后登陆 ...

  3. Python代码循环执行exe文件,并传入命令参数实现批量处理数据。

    python调用exe程序 传入命令参数,并实现循环批处理文件 1.问题背景 2.面临的问题 3.代码实现(案例) 4.总结 1.问题背景 参加MARS数据医疗赛道进行计算机视觉的比赛,比赛内容为赛题 ...

  4. python调用c优缺点_Python调用C模块以及性能分析

    一.c,ctypes和python的数据类型的对应关系 ctypes type ctype Python type c_char char 1-character string c_wchar wch ...

  5. python可以实现的小游戏_今天教小白用Python实现一款小游戏!最适合装逼的神技!亲测可用...

    pygame的安装 进群:125240963   即可获取数十套PDF哦! 如果你之前在安装python的时候,把环境变量等等都配置好了,那么安装pygame是很容易的事,只要打开cmd输入pip i ...

  6. 使用FME 批量OSGB转FBX(OBJ) (亲测)

    首先感谢这个UP主(这种好视频,必须支持):OSGB单体模型批量转FBX,并保留原有文件目录_哔哩哔哩_bilibili 吐槽:刚开始使用了OpenSceneGraph 去转换,发现贴图有黑斑.而且没 ...

  7. Python从父目录的其他文件夹中导入模块的解决方案(亲测有效)

    简单吐槽 这两天在下载github上的python程序来跑的时候,发现经常出现的一个问题:当在某一python脚本文件想要导入父目录下的其他文件夹中的模块时,会报错 Traceback (most r ...

  8. CentOS7 搭建Pulsar 消息队列环境,CentOS(Linux)部署Pulsar,亲测成功,以及Python操作Pulsar实例驱动

    在 最佳开源数据库与数据分析平台奖 中,之前曾连续两年入选的 Kafka 意外滑铁卢落选,取而代之的是新兴项目 Pulsar,Bossie Awards中对 Pulsar 点评如下:"Pul ...

  9. python标注工具_Python labelImg 图像标注工具安装及使用教程windows版(亲测有效)

    1.首先先下载这个工具的源代码(此处贴一个github上面的源代码) 地址:https://github.com/tzutalin/labelImg 2.安装 QT5 tools 看到如上图,表示安装 ...

最新文章

  1. 求数组中奇数偶数的个数
  2. Linux环境变量的修改(永久,暂时)
  3. 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课1.4节修改图稿的视图...
  4. BI中事实表和维度表的定义+具体SQL操作(转载+自己添加实验)
  5. 质数和分解(动态规划)
  6. php双向链表+性能,PHP双向链表定义与用法示例
  7. YIi2 對接 支付寶Alipay支付接口
  8. 你准备好了吗,he is coming
  9. 6个用于大数据分析的最好工具(转)
  10. r语言矩阵运算_R中的矩阵运算
  11. AX2012 R3 Data upgrade checklist sync database step, failed to create a session;
  12. PC端QQ协议解析之0825
  13. 51单片机驱动 矩阵键盘原理及简单实现
  14. has leaked IntentReceiver ...that was originally registerd here.Are you missing a call to unregister
  15. python 数组去重复
  16. 软件测试职业规划:发展方向多元化
  17. 【机器学习】贝叶斯学习
  18. Adobe Photoshop Lightroom Classic 中文版
  19. 如何让Arduino用2颗5号电池运行1年以上--Arduino低功耗
  20. 计算机图形学领域国际期刊以及会议介绍

热门文章

  1. 安装python应该先安装pycharm还是python_Pycharm及python安装详细步骤及PyCharm配置整理(推荐)...
  2. java 中都有什么结构_java中都有哪些数据结构?
  3. 2.2.python正则表达式
  4. Apache Tez介绍,术语,安装,监控等
  5. 最全的IO操作知识总结
  6. Visual Studio Code连接SQL SERVER 2019
  7. odps结合mysql统计
  8. 【tensorflow】全连接层函数tf.layers.dense()原理
  9. 书籍折页是什么效果_Word的书籍折页是什么 如何设置Word的书籍折页
  10. 左边替换 oracle,sqlsever替换右边第4个字符