使用python批量插入数据到mysql的三种方法
自动化单条insert
# -*- coding:utf-8 -*-
import time
from pymysql import *
# 装饰器,计算插入50000条数据需要的时间
def timer(func):
def decor(*args):
start_time = time.time()
func(*args)
end_time = time.time()
d_time = end_time - start_time
print("the running time is : ", d_time)
return decor
@timer
def add_test_users():
conn = connect(host='主机名', port='端口号', user='用户名', password='密码', database='数据库名', charset='utf8')
cs = conn.cursor() # 获取游标
for num in range(0, 58000):
try:
sql = "insert into '表名'(字段名) values(值)"
cs.execute(sql)
except Exception as e:
return
conn.commit() # 提交
cs.close()
conn.close()
print('OK')
add_test_users()
- 单条insert的话插入5w条数据大约用时5秒左右,相对来说效率不高
拼接sql语句,只执行一次insert
# -*- coding:utf-8 -*-
import time
from pymysql import *
# 装饰器,计算插入50000条数据需要的时间
def timer(func):
def decor(*args):
start_time = time.time()
func(*args)
end_time = time.time()
d_time = end_time - start_time
print("the running time is : ", d_time)
return decor
@timer
def add_test_users():
usersvalues = []
for num in range(1, 50000):
usersvalues.append(('需要插入的字段对应的value')) # 注意要用两个括号扩起来
conn = connect(host='主机名', port='端口号', user='用户名', password='密码', database='数据库名', charset='utf8')
cs = conn.cursor() # 获取光标
# 注意这里使用的是executemany而不是execute,下边有对executemany的详细说明
cs.executemany('insert into '表名'(字段名) values(%s,%s,%s,%s)', usersvalues)
conn.commit()
cs.close()
conn.close()
print('OK')
add_test_users()
使用这种批量插入方式插入5w条数据用时大约不到1秒
另外,针对executemany
execute(sql) : 接受一条语句从而执行
executemany(templet,args):能同时执行多条语句,执行同样多的语句可比execute()快很多,强烈建议执行多条语句时使用executemany
templet : sql模板字符串, 例如 ‘insert into table(id,name,age) values(%s,%s,%s)’
args: 模板字符串中的参数,是一个list,在list中的每一个元素必须是元组!!! 例如: [(1,‘mike’),(2,‘jordan’),(3,‘james’),(4,‘rose’)]
使用load data infile 加载到mysql
需要注意的是,这种方式本来是在mysql里边执行的命令,而这里是用代码实现的命令
如果是在linux下,需要进行下边几个步骤
在桌面写个文本文件,里边的内容对应下边的数据表字段即可
cd /var/lib/mysql-files/
切换到这个目录,将文本文件移动到这个目录下,如果不在这个目录下执行的话加载的时候会出现错误,当然也可以选择修改mysql配置,只不过这种方法相对比较简单
对应load data infile 可以在mysql里边直接执行文件即可
load data infile ‘/var/lib/mysql-files/data.txt’ into table ‘表名’(字段名) 这个命令
load data [low_priority] [local] infile ‘file_name txt’ [replace | ignore]
into table tbl_name
[fields
[terminated by’t’]
[OPTIONALLY] enclosed by ‘’]
[escaped by’’ ]]
[lines terminated by’n’]
[ignore number lines]
[(col_name, )]
这个是load data infile的完整命令,带[ ]的是可选参数 下面解释几个比较常用的参数
[terminated by’t’] 这个意思就是文本字段里边以什么分隔
如果文本文件是这样:
小一,12,男
小二,13,女
小三,12,男
那么就是应该terminated by ’ , ’ ,不设置默认的就是制表符分隔,上边定义的文本文件正好也就是制表符,因此没有做设置,按照的就是默认值
==enclosed by == 这个的意思是字段是以什么包裹着
如果文本文件是这样:
“小一”,“12”,“男”
“小二”,“13”,“女”
“小三”,“12”,“男”
那么参数就应该这样写:enclosed by “”
…
综合以上三种方法比较,第三种方法效率最高,因此建议用第三种方
python向mysql插入大量数据时注意事项
通过python向mysql插入大量数据时:
1、for + cursor.execute(sql),最后集中提交(commit())
2、cursor.executemany(sql,list)
两种方法效率上和功能上有一定差异。26万条数据,使用第一种方法需要约1.5小时,使用第二种方法只需要10几秒。
executemany的用法:
import pymysql
list_1 = [('a',1),('b',2),(None,3)] # 元素是不是元组都可以
sql_1 = 'insert into 表明(字段1,字段2) values(%s,%s)'
# 注意,这里的%s不需要加引号,使用execute需要加引号。
# 另外,executemany 在执行过程中能够将python的None转为sql的null
db = pymysql.connect(host= ....)
cursor = db.cursor()
cursor.executemany(sql_1,list_1)
db.commit()
cursor.close()
db.close()
print('完成')
二、自动提交
在创建连接的时候,增加参数 autocommit = 1 ,当发生update等操作时,会实时更新到数据库内。否则要通过 conn.commit() 来提交到数据库进行具体操作。
如果没有设置自动提交,也没有手动提交,当进行插入或更新等操作时,只在本地客户端能看到更新,在其他客户端或数据库内,数据无变化。
# 实时操作,适合随时少量、频繁的更新
import pymysql
conn = pymysql.connect(
host='XXX.XXX.XXX.XXX',
user='XXXXX',
password='XXXXX',
db='XXXXX',
port=3306,
charset='utf8',
autocommit = 1 ,
)
# 集中大批量操作数据
import pymysql
conn = pymysql.connect(
host='XXX.XXX.XXX.XXX',
user='XXXXX',
password='XXXXX',
db='XXXXX',
port=3306,
charset='utf8',
)
SQl相关操作略
conn.commit() # 提交
原文链接:https://blog.csdn.net/pxx000000/article/details/126600034
文章出处登录后可见!