1.描述
-
教你一招,将 10W+
的数据快速写入MySQL
2.思路
(1)引入pymysql
-
连接 pymysql
配置
conn = pymysql.connect(
host="127.0.0.1", # MySQL服务器地址
port=3306, # MySQL服务器端口号
user="root", # 用户名
password="123456", # 密码
database="eleven", # 数据库名称
charset="utf8") # 连接编码
cursor = conn.cursor() # 使用该连接创建并返回游标
-
SQL
配置
sql = 'INSERT INTO coupon(coupon_name) VALUES(%s);' # 添加SQL语句
cursor.execute(sql, data) # 执行数据库的SQL命令
conn.commit() # 提交
cursor.close() # 关闭游标对象
conn.close() # 关闭MySQL连接
(2)装饰器
-
计算 10W+
数据需要的时间
# 装饰器,计算插入100000条数据需要的时间
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
(3)多线程
-
引入多线程
apply_async:首先主进程开始运行,碰到子进程后,主进程说:让我先运行个够,等到操作系统进行进程切换的时候,在交给子进程运行。
import multiprocessing
if __name__ == '__main__':
coupon_pool = multiprocessing.Pool(2) # 2个线程池
coupon_pool.apply_async(coupon_code()) # 异步
3.代码
'''
Function:
教你一招,将10W+数据快速写入MySQL
Author:
Eleven
微信公众号:
ElevenKeep
编写日期:
2020-07-29
'''
from faker import Faker
import pymysql
import time
import multiprocessing
# 装饰器,计算插入100000条数据需要的时间
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 coupon_code():
# pymysql
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
password="123456",
database="eleven",
charset="utf8")
cursor = conn.cursor()
fake = Faker()
# 10万条数据,需要30s
for count in range(100000):
try:
count += 1
data = 'code no.' + str(count) + ' ' + fake.password(length=12, special_chars=None, lower_case=None) + '\n'
sql = 'INSERT INTO coupon(coupon_name) VALUES(%s);'
cursor.execute(sql, data)
except Exception as e:
return
conn.commit()
cursor.close()
conn.close()
if __name__ == '__main__':
coupon_pool = multiprocessing.Pool(2)
coupon_pool.apply_async(coupon_code())
-
耗时:10W+数据耗时33s
-
数据库数据