天天看點

使用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下,需要進行下邊幾個步驟

在桌面寫個文本檔案,裡邊的内容對應下邊的資料表字段即可

使用python批量插入資料到mysql的三種方法
使用python批量插入資料到mysql的三種方法

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 “”

綜合以上三種方法比較,第三種方法效率最高,是以建議用第三種方法,當然批量插入mysql的還有其他更高效的方法,這裡隻是簡單的提到幾種比較容易操作的,如果想深入研究可檢視相關資料.

繼續閱讀