python代碼執行SQL文件(逐句執行)

1、簡介

關於Python如何鏈接數據庫並執行SQL語句,幾乎全部的Python教程都會講,教程裏基本只介紹了執行單條SQL語句的方法,可是實際生產過程當中可不僅是執行一兩條語句,動輒幾十條甚至上百條的SQL語句,一個.SQL的SQL文件正常都會包含多條SQL語句,若是把這些SQL語句直接貼進Python代碼文件,勢必會影響代碼的可讀性和美感,代碼量也冗餘,那麼Python能不能像oracle的PL/SQL客戶端或者navicat同樣讀取SQL文件而且執行會是一件很是有趣的事情。python

 

通過不斷百度和嘗試,一段優雅的Python代碼終於敲出來,做爲開源的忠實粉絲,技術始於分享,現將Python執行SQL文件的代碼分享在CSDN,代碼實例是MySQL數據庫mysql

2、原理實現

咱們知道,mysql的語句執行時,默認是以分號結尾的。所以,只要將整個sql文件讀取,以分號切割,就能夠獲得sql語句。sql

sql文件,內容以下:數據庫

USE test; /*遷移用戶信息*/ INSERT INTO `users` ( `UID`, `USERNAME`, `PASSWORD`, `ROLE`, `CREATE_TIME` ) SELECT `id`, `username`, `password`, `level`, `create_time` FROM tbl_users;

 

使用python切割以分號切割,打印的sql仍是不少行。所以須要將換行符,替換爲空格。末尾增長分號結尾服務器

with open('test.sql',encoding='utf-8',mode='r') as f: # 讀取整個sql文件,以分號切割。[:-1]刪除最後一個元素,也就是空字符串 sql_list = f.read().split(';')[:-1] for x in sql_list: # 判斷包含空行的 if '\n' in x: # 替換空行爲1個空格 x = x.replace('\n', ' ') # sql語句添加分號結尾 sql_item = x+';' print(sql_item)

 

執行輸出:oracle

USE test; /*遷移用戶信息*/ INSERT INTO `users` (     `UID`,     `USERNAME`,     `PASSWORD`,     `ROLE`,     `CREATE_TIME` ) SELECT     `id`,     `username`,     `password`,     `level`,     `create_time` FROM     tbl_users;

 

能夠發現,會有不少空行。能夠再加一個判斷,進行替換spa

with open('test.sql',encoding='utf-8',mode='r') as f: # 讀取整個sql文件,以分號切割。[:-1]刪除最後一個元素,也就是空字符串
    sql_list = f.read().split(';')[:-1] for x in sql_list: # 判斷包含空行的
        if '\n' in x: # 替換空行爲1個空格
            x = x.replace('\n', ' ') # 判斷多個空格時
        if '    ' in x: # 替換爲空
            x = x.replace('    ', '') # sql語句添加分號結尾
        sql_item = x+';'
        print(sql_item)

 

執行輸出:.net

USE test; /*遷移用戶信息*/ INSERT INTO `users` ( `UID`, `USERNAME`, `PASSWORD`, `ROLE`, `CREATE_TIME` ) SELECT `id`, `username`, `password`, `level`, `create_time` FROM tbl_users;

 

3、正式代碼

上面的步驟已經獲得完整的sql語句了,那麼就可使用pymysql模塊來執行每一句sql了。code

 

環境說明

原始表結構爲:blog

CREATE TABLE `tbl_users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶名', `password` char(32) NOT NULL DEFAULT '' COMMENT '密碼', `level` tinyint(10) NOT NULL DEFAULT '2' COMMENT '用戶等級', `create_time` datetime DEFAULT NULL COMMENT '建立時間', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用戶表';

 

目標表結構爲:

CREATE TABLE `users` ( `UID` bigint(20) NOT NULL AUTO_INCREMENT, `USERNAME` varchar(20) NOT NULL DEFAULT '' COMMENT '用戶名', `PASSWORD` char(32) NOT NULL DEFAULT '' COMMENT '密碼', `ROLE` varchar(20) NOT NULL DEFAULT '' COMMENT '角色', `CREATE_TIME` datetime DEFAULT NULL COMMENT '建立時間', PRIMARY KEY (`UID`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用戶表';

 

須要將原始表的數據,遷移到目標表中。

mysql服務器ip爲 192.168.10.104,用戶名和密碼都是root,使用test數據庫。

 

完整代碼

完整代碼以下:

#!/usr/bin/env python3 # coding: utf-8
import pymysql try: db = pymysql.connect("192.168.10.104", "root", "root", "test") c = db.cursor() with open('test.sql',encoding='utf-8',mode='r') as f: # 讀取整個sql文件,以分號切割。[:-1]刪除最後一個元素,也就是空字符串
        sql_list = f.read().split(';')[:-1] for x in sql_list: # 判斷包含空行的
            if '\n' in x: # 替換空行爲1個空格
                x = x.replace('\n', ' ') # 判斷多個空格時
            if '    ' in x: # 替換爲空
                x = x.replace('    ', '') # sql語句添加分號結尾
            sql_item = x+';'
            # print(sql_item)
 c.execute(sql_item) print("執行成功sql: %s"%sql_item) except Exception as e: print(e) print('執行失敗sql: %s'%sql_item) finally: # 關閉mysql鏈接
 c.close() db.commit() db.close()

 

執行輸出:

執行成功sql: USE test; 執行成功sql: /*遷移用戶信息*/ INSERT INTO `users` ( `UID`, `USERNAME`, `PASSWORD`, `ROLE`, `CREATE_TIME` ) SELECT `id`, `username`, `password`, `level`, `create_time` FROM tbl_users;

 

 

本文參考連接:

http://www.javashuo.com/article/p-fmkzrvku-kw.html

相關文章
相關標籤/搜索