自動化單條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配置,隻不過這種方法相對比較簡單
# -*- coding:utf-8 -*-
import time
from pymysql import *
# 裝飾器 記錄時間
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 exc_data():
conn = connect(host='主機名', port='端口号', user='使用者名', password='密碼', database='資料庫名', charset='utf8')
cs = conn.cursor()
# 注意表明後邊添加的字段名要與自己寫的文本檔案相對應,如果文本檔案有主鍵,而且與其他字段也是一一對應,這裡隻
需要寫上一個資料表即可,但是如果文本檔案一般情況下是沒有定義主鍵的,是以我們需要在這裡添加上幾個除主鍵外其他
的字段名
sql = "load data infile '/var/lib/mysql-files/data.txt' into table '表名'(字段名);" # 針對定
義好的資料表以及文本,就是應該添加上這幾個字段 (name,age,gender,classify_id)
cs.execute(sql)
conn.commit()
cs.close()
conn.close()
print('OK')
exc_data()
對應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 “”
…