Python pymysql批量執行目錄裏面的多個sql文件

思路:
循環指定目錄中的每個.sql文件,讀取每行內容,拼接到列表中,按每次1000行執行。

備註:
pymysql在8.0版本以前(不包含8.0)默認可以同時執行多條sql語句的,例如“insert into tb(1);insert into tb(2);”
但是在8.0之後不再爲默認,需要手動配置pymysql.connect的參數client_flag=CLIENT.MULTI_STATEMENTS,否則會報錯。

import os
import pymysql
from pymysql.constants import CLIENT


# pymysql在8.0版本之後需要手動配置,以支持同時執行多條sql語句
conn = pymysql.connect(host='192.168.1.17', user='root', passwd="password", db='db1', client_flag=CLIENT.MULTI_STATEMENTS)
cur = conn.cursor()

path = r'D:\Projects\sql'
for filename in os.listdir(path):
    if filename.endswith(".sql") == False:
        continue  
    count = 0
    time = 0
    sql = []    
    filepath = os.path.join(path,filename)
    with open(filepath, "r", encoding="utf-8") as f:
        for each_line in f.readlines():                  
            if not each_line or each_line == "\n":                 
                continue            
            if count < 1000: 
                sql.append(each_line.strip())               
                count += 1
            else:
                #達到1000行時執行            
                time += 1
                print('{}第{}次開始執行sql語句,記錄數:{}'.format(filename, time, count))
                cur.execute("".join(sql))
                conn.commit()
                sql = [each_line.strip()]                
                count = 1
        #讀取完文件,不到1000行
        if sql:         
            time += 1
            print('{}第{}次開始執行sql語句,記錄數:{}'.format(filename, time, count))
            cur.execute("".join(sql))
            conn.commit()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章