# -*- coding:utf-8 -*- import uuid import random import time from datetime import datetime import pymysql as mysql from threading import Thread, current_thread host = "127.0.0.1" port = 3306 username = "svc" password = "svc123" charset = "utf-8" db = "svc" class QuickInsert(object): def __init__(self): super(QuickInsert, self).__init__() @staticmethod def connect(): return mysql.connect(host=host, port=port, user=username, passwd=password, db=db) def strTimeProp(self, start, end, prop, frmt): stime = time.mktime(time.strptime(start, frmt)) etime = time.mktime(time.strptime(end, frmt)) ptime = stime + prop * (etime - stime) return int(ptime) def randomTimestamp(self, frmt='%Y-%m-%d %H:%M:%S'): start = '2016-06-02 12:12:12' end = '2020-07-27 00:00:00' return self.strTimeProp(start, end, random.random(), frmt) def randomDate(self, frmt='%Y-%m-%d'): start = '2015-06-02' end = '2021-01-21' return self.strTimeProp(start, end, random.random(), frmt) def createPhone(self): for k in range(10): prelist = ["130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "147", "150", "151", "152", "153", "155", "156", "157", "158", "159", "186", "187", "188", "189"] return random.choice(prelist) + "".join(random.choice("0123456789") for i in range(8)) def getCardName(self): for k in range(10): prelist = ["圣诞咖啡快乐会员星礼包红杯字母款", "大杯香草风味星冰乐电子券", "星巴克星情月饼礼盒", "大杯冷萃冰咖啡(手机银行)", "2020 年Roastery 专用咖啡乐园券", "大杯摩卡", "实用主义商品福袋", "香草风味拿铁大杯电子券", "星巴克夏日活力早餐套餐电子券", "摩卡可可碎片星冰乐"] return random.choice(prelist) def getCardStatus(self): for k in range(10): prelist = ["01-已使用", "04-未激活", "03-未激活", "06-激活", "10-系统作废", "0-已使用", "20-作废"] return random.choice(prelist) def getIsReplace(self): for k in range(10): prelist = ["Y", "N"] return random.choice(prelist) def insert_data(self, times, sql_b, s_id): startTime = datetime.now() print(current_thread().getName(), "开始时间", startTime) start_id = s_id sql_batch = sql_b print(current_thread().getName() + "开始于:" + str(start_id) + ",times:" + str(times)) cursor = self.conn.cursor() for x in range(times): insert_user_sql = """ INSERT INTO T_BALANCE_REPORT (`ID`,`ACCOUNT_ID`,`CARD_NO`,`CARD_NAME`,`CARD_STATUS`,`UPDATE_DATE`,`TRADING_DATE`,`BALANCE`,`INIT_AMOUNT`,`INIT_DATE`,`VALID_END_DATE`,`IS_REPLACE`,`OLD_CARD_NO`) VALUES ( %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s ); """ user_values, order_values = [], [] # user_values = [] for i in range(sql_batch): timestamp = self.randomTimestamp() time_local = time.localtime(timestamp) createTime = time.strftime("%Y-%m-%d %H:%M:%S", time_local) radomDate = time.strftime("%Y-%m-%d", time_local) user_id = str(uuid.uuid4()) user_values.append(( # 参数 start_id, start_id, start_id, self.getCardName() + str(start_id), self.getCardStatus(), createTime, createTime, random.randint(1, 30000) / random.randint(1, 17), random.randint(100, 10000), radomDate, radomDate, self.getIsReplace(), # self.createPhone() "".join(random.choice("0123456789") for i in range(8)) )) start_id = start_id + 1 cursor.executemany(insert_user_sql, user_values) # cursor.executemany(insert_user_sql, order_values) self.conn.commit() print(current_thread().getName() + "--写入点:" + str((x * 10000) + start_id)) cursor.close() endTime = datetime.now() print(current_thread().getName(), "结束时间", endTime, "共持续", (endTime - startTime).seconds, "秒") if __name__ == "__main__": ######################################### # 写入总数为:threads * times * sql_batch # # offset : 偏移量,默认是0。如果数据库有数据,可以设一个起始点(偏移量) # threads : 线程数 # times : 每个线程执行commit的次数 # sql_batch : 每次commit多少数据 # 例:要造一亿数据 # threads = 5 # times = 2000 # sql_batch = 10000 ######################################### # 下次运行的起始位置 = (threads * times * sql_batch) + offset offset = 1 threads = 3 times = 10 sql_batch = 10000 print("----------------本次写入总数:" + str(threads * times * sql_batch)) for i in range(threads): start_id = (i * times * sql_batch) + offset quickInsert = QuickInsert() quickInsert.conn = QuickInsert.connect() t = Thread(target=quickInsert.insert_data, args=(times, sql_batch, start_id)) t.start() # t.join() # 同步操作