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

相关文章
相关标签/搜索