365b98f9331dafccc49d38005bbafd9d.png

此脚本是用来跑mysql的自动执行的。

脚本功能主要是执行开发各阶段的数据库脚本(存放在svn库中)

执行通过的脚本会copy到下一个测试流程的待执行目录中,并且在原目录进行改名,在下次跑任务的时候过滤掉已执行过的脚本。

#!/bin/python

import os,shutil

import sys

import string

import time

import mysql.connector

import io

import json

SYS = sys.argv[1]

DATE = sys.argv[2]

ENV = sys.argv[3]

TYPE = sys.argv[4]

#外部参数传入格式

def add(path):

cmd = "svn add %s"%path  #参数传入格式%s

os.system(cmd)

def rm(path):

cmd = "svn rm %s"%path

os.system(cmd)

def commit():

message=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))  #获取时间函数和格式

cmd = "svn commit -m "%s""%message

#测试时使用    print cmd

os.system(cmd)   #模拟命令行执行命令

def checkdir(t):

if not os.path.exists(t):

os.makedirs(t)   #新建目录需加上版本控制,否则拷贝过来的文件也无法使用svn add

add(t)

basedir = os.getcwd()    #获取脚本所在路径,我把配置文件和脚本文件放在一起了

svn_dir = "/>

project_dir = svn_dir + SYS + "/"   #路径合成,需考虑到"/"

env_dir = project_dir + DATE + "/" + ENV + "/"

sql_dir = env_dir + TYPE + "/"

#change to sql directory

if not os.path.exists(sql_dir):                           #判断路径是否存在函数格式

print "No such directory,please check svn repository"

sys.exit(1)

print sql_dir

os.chdir(sql_dir)    #切换路径函数

#remove *.done

ls = os.listdir(".")    #获取路径下所有文件到列表

new_ls = os.listdir(".")

new_ls.sort()  #列表排序函数

print new_ls

for l in ls:

if l[-4:] == "done":

new_ls.remove(l)     #循环remove列表元素时,删除第一个元素后,原列表中元素移位,导致匹配偏差

#check new sql script

if len(new_ls):    #判断列表长度,如无参数,执行else段代码

for filename in new_ls:    #循环读取列表参数

print filename

#get db info

f = io.open(basedir+"/mysql.json", encoding="utf-8")     #解析json文件

p = json.load(f)

s = p[SYS][ENV]   #抽取所需的数据段到字典s,多层数据格式

with open(filename, "r") as f:    #打开sql脚本

data = f.read()

print(data)

mydb = mysql.connector.connect(

host = s["host"],    #python字典抽取对应值

user = s["user"],

passwd = s["passwd"],

database = s["database"]

)

mycursor = mydb.cursor()    #连接mysql数据库

mycursor.execute(data)      #执行sql脚本

#copy dat to uat,copy uat to prod

oldfile = sql_dir + "/" + filename

print oldfile

if string.rfind(sql_dir,"dat"):     #判断路径是否包含特定字段

new_env_dir = project_dir + DATE + "/uat/"

checkdir(new_env_dir)

new_sql_dir = new_env_dir + TYPE + "/"

checkdir(new_sql_dir)

log = "copy " + filename + " to " + new_sql_dir

print log

newfile = new_sql_dir + filename

shutil.copyfile(oldfile,newfile)

add(newfile)

elif string.rfind(sql_dir,"uat"):

new_env_dir = project_dir + DATE + "/prod/"

checkdir(new_env_dir)

new_sql_dir = new_env_dir + TYPE + "/"

checkdir(new_sql_dir)

log = "copy " + filename + " to " + new_sql_dir

print log

newfile = new_sql_dir + filename

shutil.copyfile(oldfile,newfile)   #copy的函数和模块,注意参数格式

add(newfile)

else:

print "No correct path"

sys.exit(1)

#rename the script with .done

newfilename = filename + ".done"

os.rename(filename,newfilename)  #重命名方式,需提供源文件和目标文件

rm(filename)

add(newfilename)

#注意执行完之后svn的提交路径,和代码段对其方式

os.chdir(svn_dir)

cmd = "svn update"

os.system(cmd)

commit()

else:

print "No new sql script!"

sys.exit()

mysql.json   格式

{

"sysname": {

"sit": {

"host": "xx.xx.xx.xx",

"user": "admin",

"passwd": "xxxx,

"database": "xxxx"

},

"uat": {

"host": "xx.xx.xx.xx",

"user": "xxxx",

"passwd": "xxxx",

"database": "xxxx"

}

}

}

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐