valid反义词python执⾏sql⽂件取标准输出_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`,
接口类型hdmi是可以接电脑主机吗>signal官方下载`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 insql_list:
# 判断包含空⾏的if '\n' inx:
# 替换空⾏为1个空格
x= x.replace('\n', ' ')
# 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 insql_list:#判断包含空⾏的
if '\n' inx:#替换空⾏为1个空格
x = x.replace('\n', ' ')#判断多个空格时
if ' ' inx:#替换为空
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`)text函数使用技巧
) 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
importpymysqltry:
db= t("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 insql_list:#判断包含空⾏的
if '\n' inx:#替换空⾏为1个空格
python基础代码实例x = x.replace('\n', ' ')#判断多个空格时
if ' ' inx:#替换为空
x = x.replace(' ', '')#sql语句添加分号结尾
sql_item = x+';'
#print(sql_item)
excel表格软件c.execute(sql_item)print("执⾏成功sql: %s"%sql_item)exceptException as e:print(e)print('执⾏失败sql: %s'%sql_item)finally:#关闭mysql连接
c.close()
dbmit()
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;
本⽂参考链接:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。