# -*- coding:UTF-8 -*- from pymysql import connect import gevent import time class MyPyMysql: # 初始化屬性 def __init__(self, host, port, username, password, db, charset='utf8'): self.host = host # mysql主機地址 self.port = port # mysql端口 self.username = username # mysql遠程連接用戶名 self.password = password # mysql遠程連接密碼 self.db = db # mysql使用的數據庫名 self.charset = charset # mysql使用的字符編碼,默認為utf8 self.pymysql_connect() # __init__初始化之后,執行的函數 def pymysql_connect(self): # pymysql連接mysql數據庫 # 需要的參數host,port,user,password,db,charset self.conn = connect(host=self.host, port=self.port, user=self.username, password=self.password, db=self.db, charset=self.charset ) # 連接mysql后執行的函數 self.asynchronous() def Run(self, nmin, nmax): # 創建游標 self.cur = self.conn.cursor() # 定義sql語句,插入不同數據時需更改此sql語句,飄黃警告可忽略 sql = "INSERT INTO s_capital_back_order (id,order_code,sub_order_code,back_order_code,pay_method_code,pay_type,refund_channel_order_code,refund_type,order_product_amounts,refund_amounts,order_time,pay_time,back_order_time,refund_time,create_time) " \ "VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" # 定義總插入行數為一個空列表 data_list = [] for i in range(nmin, nmax): # 插入具體的假數據,需要與上方的sql語句的元素對應 result = (1104+i, "T6030513731188889870000" + str(i), "T6130513731188889870000" + str(i), "6221238129371983112" + str(i), "weChat", "20", "50000032020190507035840868"+str(i), "30", "10", "11", "2019-04-28 17:20:00", "2019-04-28 17:20:00", "2019-04-28 17:20:00","2019-04-28 17:20:00","2019-04-28 17:20:00" ) # 添加所有任務到總的任務列表,即 將每次添加的數據插入總列表 data_list.append(result) # 執行多行插入,executemany(sql語句,數據(需一個元組類型)),使用executemany執行多行插入可縮短插入時間提高效率 content = self.cur.executemany(sql, data_list) if content: print('成功插入第{}條數據'.format(nmax - 1)) # 提交數據,必須提交,不然數據不會保存 self.conn.commit() def asynchronous(self): # g_l 任務列表 # 定義了異步的函數: 這里用到了一個gevent.spawn方法 max_line = 50 # 定義每次最大插入行數(max_line=10000,即一次插入10000行) g_l = [gevent.spawn(self.Run, i, i + max_line) for i in range(1, 101, max_line)] # gevent.joinall 等待所以操作都執行完畢 gevent.joinall(g_l) self.cur.close() # 關閉游標 self.conn.close() # 關閉pymysql連接 if __name__ == '__main__': start_time = time.time() # 計算程序開始時間 st = MyPyMysql('192.168.0.231', 3307, 'root', '1q2w3e', 'finance') # 實例化類,傳入必要參數 print('程序耗時{:.2f}'.format(time.time() - start_time)) # 計算程序總耗時