Python2.x 脚本批量串行select查询数据库,格式化输出到txt文件

原创
2016/10/11 10:39
阅读数 1K

    个人习惯脚本目录、文件存放目录如下:

    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 "输入有误,参数不足!"

print

-----------------------------------------------------------------------------------------------------------------------------------

    上面的脚本提供了两种使用方法:

   【 方法一:命令行传参数,脚本运行一次只处理一条select语句】

    命令行格式:python   connectMySQL.py   "select ......"   生成的文件名

    举例如下(这里select整句话一定要用""引号引起来):

    查看生成的文件:

 

    【方法二:将select语句写入select.sql文件中,脚本运行一次处理全部select.sql中的select语句】

    文件格式如下图(#为注释,select以;分号结尾,紧跟文件名,也是分号结尾;换行另一句select):

    命令行直接执行(无需任何参数):python   connectMySQL.py

    查看执行结果:

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部