自动化脚本创建mysql数据库_自动化执行数据库脚本
此脚本是用来跑mysql的自动执行的。脚本功能主要是执行开发各阶段的数据库脚本(存放在svn库中)执行通过的脚本会copy到下一个测试流程的待执行目录中,并且在原目录进行改名,在下次跑任务的时候过滤掉已执行过的脚本。#!/bin/pythonimport os,shutilimport sysimport stringimport timeimport mysql.connectorimport

此脚本是用来跑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"
}
}
}
更多推荐



所有评论(0)