Python2.x 脚本批量串行select查询数据库,格式化输出到txt文件
个人习惯脚本目录、文件存放目录如下:
Python脚本及读取文件存放目录:/root/python
脚本执行select后生成的文件目录:/root/select
话不多说,上主脚本:
# vim /root/python/connectMySQL.py
-----------------------------------------------------------------------------------------------------------------------------------
# -*- coding: utf-8 -*-
import MySQLdb
import sys
import os
import time
print
mysql_host="127.0.0.1" # 数据库ip地址
mysql_user="root" # 数据库用户名
mysql_password="123456" # 数据库用户密码
select_dir="/root/select" + "/" + str(time.strftime('%Y%m%d',time.localtime(time.time()))) # 数据库查询结果存放的根目录
def SelectInfo(sql): # 连接数据并执行SQL语句的函数
conn = MySQLdb.connect(mysql_host,mysql_user,mysql_password) # 连接数据库
cur = conn.cursor() # 打开数据库命令行的游标
cur.execute("set names latin1") # 强制设置客户端连接数据库字符集为 latin1
cur.execute(sql) # 执行SQL语句
result = cur.fetchall() # 取出SQL语句执行后的数据结果集
title = cur.description # 取出SQL语句执行后的数据表头信息
cur.close() # 关闭数据库命令行的游标
conn.close() # 关闭数据库连接
return title,result # 将数据库结果集返回给函数
if not os.path.exists(select_dir): # 判断select_dir是否存在,如果不存在就创建该目录
os.makedirs(select_dir)
if len(sys.argv) <= 1:
sqlStr = ''
for i in open('select.sql','r').readlines():
if i.startswith('#') == True: # 忽略掉#号开头的行
pass
else:
sqlStr = sqlStr + i
reSql = sqlStr.split(';') # 将所有的sql语句赋值给reSql; select.sql文件里的sql语句要以';'结尾
for sql in range(len(reSql)-1):
if sql % 2 == 0:
title = SelectInfo(reSql[sql])[0] # 取出表头结果集
result = SelectInfo(reSql[sql])[1] # 取出数据结果集
filename = str(select_dir) + "/" + str(" ".join(reSql[sql+1].split())) # 格式化txt文件名字,避免出现 \n(回车) (空格) 等字符
f = open(filename, 'a+') # 打开并准备往文件中追加,w+ 为写,r+为读,a+为追加
if not os.path.getsize(filename):
for j in range(len(title)): # 遍历表头结果集,取出数据库对应列名称
print >> f,str(title[j][0]) + "\t",
print >> f # 表头写到txt后换行
for line in range(len(result)): # 遍历数据结果集,取出每一行数据
for k in range(len(result[line])):
print >> f,str(result[line][k]) + "\t",
print >> f
print "%s has OK!" % filename
elif len(sys.argv) >= 3:
title = SelectInfo(sys.argv[1])[0]
result = SelectInfo(sys.argv[1])[1]
filename = str(select_dir) + "/" + str(" ".join(sys.argv[2].split()))
f = open(filename, 'a+')
if not os.path.getsize(filename):
for j in range(len(title)):
print >> f,str(title[j][0]) + "\t",
print >> f
for line in range(len(result)):
for k in range(len(result[line])):
print >> f,str(result[line][k]) + "\t",
print >> f
print "%s has OK!" % filename
else:
print "输入有误,参数不足!"
-----------------------------------------------------------------------------------------------------------------------------------
上面的脚本提供了两种使用方法:
【 方法一:命令行传参数,脚本运行一次只处理一条select语句】
命令行格式:python connectMySQL.py "select ......" 生成的文件名
举例如下(这里select整句话一定要用""引号引起来):
查看生成的文件:
【方法二:将select语句写入select.sql文件中,脚本运行一次处理全部select.sql中的select语句】
文件格式如下图(#为注释,select以;分号结尾,紧跟文件名,也是分号结尾;换行另一句select):
命令行直接执行(无需任何参数):python connectMySQL.py
查看执行结果:
转载于:https://my.oschina.net/jamieliu/blog/756702