日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

python代码执行SQL文件(逐句执行)

發布時間:2023/12/24 综合教程 42 生活家
生活随笔 收集整理的這篇文章主要介紹了 python代码执行SQL文件(逐句执行) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡介

關于Python如何連接數據庫并執行SQL語句,幾乎所有的Python教程都會講,教程里基本只介紹了執行單條SQL語句的方法,但是實際生產過程中可不只是執行一兩條語句,動輒幾十條甚至上百條的SQL語句,一個.SQL的SQL文件正常都會包含多條SQL語句,如果把這些SQL語句直接貼進Python代碼文件,勢必會影響代碼的可讀性和美感,代碼量也冗余,那么Python能不能像oracle的PL/SQL客戶端或者navicat一樣讀取SQL文件并且執行會是一件非常有趣的事情。

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

二、原理實現

我們知道,mysql的語句執行時,默認是以分號結尾的。因此,只要將整個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 '
' in x:
            # 替換空行為1個空格
            x = x.replace('
', ' ')

        # sql語句添加分號結尾
        sql_item = x+';'
        print(sql_item)

執行輸出:

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

可以發現,會有很多空行。可以再加一個判斷,進行替換

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 '
' in x:
            # 替換空行為1個空格
            x = x.replace('
', ' ')

        # 判斷多個空格時
        if '    ' in x:
            # 替換為空
            x = x.replace('    ', '')

        # sql語句添加分號結尾
        sql_item = x+';'
        print(sql_item)

執行輸出:

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

三、正式代碼

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

環境說明

原始表結構為:

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 '
' in x:
                # 替換空行為1個空格
                x = x.replace('
', ' ')

            # 判斷多個空格時
            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;

本文參考鏈接:

https://blog.csdn.net/jsyzliuyu/article/details/79632995

總結

以上是生活随笔為你收集整理的python代码执行SQL文件(逐句执行)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。