DJANGO專案用WEB的方式對MYSQL資料庫進行備份匯出等管理任務的實現
阿新 • • 發佈:2018-12-03
環境:PYTHON2.7,DJANGO1.9.9
urls.py 加一行:
url(r'^mysqldatamanage/', views.mysqldatamanage,name='mysqldatamanage'),
views.py新增對應的方mysqldatamanage,如下:
import std
def mysqldatamanage(request): if request.method=="POST": host=request.POST.get("dbip") dbname=request.POST.get("dbname") dbuname=request.POST.get("dbuname") dbpwd=request.POST.get("dbpwd") if request.POST.has_key('exp'): try: sqlstr=request.POST.get("sqlstr") #print host,ports,dbuname,dbpwd,dbname,sqlstr filenames=std.exprotmysqltoexcel(host,dbuname,dbpwd,dbname,sqlstr) except Exception: return render(request,"manage.html",{"login_err":"FAIL"}) return render(request,"manage.html",{"login_err":"downloadlink:http://IP:8080/"+filenames}) if request.POST.has_key('bak'): try: filenames=std.mysqldumpbackup(host,dbuname,dbpwd,dbname) except Exception: return render(request,"manage.html",{"login_err":"FAIL"}) return render(request,"manage.html",{"login_err":"downloadlink:http://IP:8080/"+filenames}) else: return render(request,"manage.html",{"login_err":"no set"})
呼叫自定義的std.py模組實現如下:
先匯入這些模組,有一些是和本次實現沒有關聯,只是這個模組的其它方法有用到,std.py:
# -*- coding: utf-8 -*-
import sys,re
import os
import subprocess
import datetime
import paramiko
import xlsxwriter
import time
import xlrd
import MySQLdb
import xlwt
#匯出到EXCEL的實現
def exprotmysqltoexcel(dbhost,dbuname,dbpwd,dbname,sqlstr): conn=MySQLdb.connect(host=dbhost,user=dbuname,passwd=dbpwd,db=dbname,charset='utf8') cursor=conn.cursor() count = cursor.execute(sqlstr) cursor.scroll(0,mode='absolute') results = cursor.fetchall() fields = cursor.description wbk = xlwt.Workbook() sheet = wbk.add_sheet('s1',cell_overwrite_ok=True) for titles in range(0,len(fields)): sheet.write(0,titles,fields[titles][0]) rows=1 cols=0 for rows in range(1,len(results)+1): for cols in range(0,len(fields)): sheet.write(rows,cols,results[rows-1][cols]) filenames = dbname+time.strftime("%Y-%m-%d-%H-%M-%S")+ ".xls" wbk.save(".\\files\\"+filenames) return filenames
#備份到.sql檔案的實現
def mysqldumpbackup(dbHost,dbUser,dbPasswd,dbName): backupDir=".\\files\\" dbCharset = 'utf8' backupDate = time.strftime("%Y-%m-%d-%H-%M-%S") dumppath="D:\\app\\mysql-5.7.23-winx64\\bin\\mysqldump.exe" #mysqldump的路徑 os.system(dumppath + " -h%s -u%s -p%s %s --default_character-set=%s > %s/%s_%s.sql" %(dbHost,dbUser,dbPasswd,dbName,dbCharset,backupDir,backupDate,dbName)) filenames = backupDate+"_"+dbName+".sql" return filenames
前端用到的manage.html檔案,前端我不會,隨便寫的:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>MYSQLDATAMANAGE</title>
</head>
<body>
<div id="container" class="cls-container">
<div id="bg-overlay" ></div>
<div class="cls-header cls-header-lg">
<div class="cls-brand">
<h3>MYSQLDATAMANAGE</h3>
<h4>MYSQL資料管理</h4>
</div>
</div>
<div class="cls-content">
<div class="cls-content-sm panel">
<div class="panel-body">
<p class="pad-btm">MYSQLDATAMANAGE</p>
<form id="loginForm" action="{% url 'mysqldatamanage' %}" method="POST"> {% csrf_token %}
<div class="form-group">
<div class="input-group">
<div class="input-group-addon"><i class="fa fa-user"></i></div>
<input type="text" class="form-control" name="dbip" placeholder="資料庫IP"></br>
<input type="text" class="form-control" name="dbname" placeholder="資料庫名"></br>
<input type="text" class="form-control" name="dbuname" placeholder="連線帳號"></br>
<input type="password" class="form-control" name="dbpwd" placeholder="連線密碼"></br>
<input type="text" class="form-control" name="sqlstr" placeholder="SQL語句" style="width:300px;height:111px"></br>
</div>
</div>
<button class="btn btn-success btn-block" type="submit" name="bak">
<b>備份</b>
</button>
<button class="btn btn-success btn-block" type="submit" name="exp">
<b>匯出到EXCEL</b>
</button>
<h4 style="color: red"><b>{{ login_err }}</b></h4>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
執行效果如下:
點選相應的按鈕完成對應的SQL任務,系統返回下載連結,因為我做好了WEB下載目錄的配置
除了MYSQL資料庫的匯出和備份以外,匯入和執行SQL等管理任務也可以通過這種方式在WEB端實現,後臺的方法如下:
匯入的實現:
def importmysqlfromexcel(xlsxunc,dbhost,dbuname,dbpwd,dbname,tablenames):
opxls = xlrd.open_workbook(xlsxunc)
sh = opxls.sheet_by_index(0)
dlist=[]
shrows = sh.nrows #行數
shcols = sh.ncols #列數
fo=[]
fo.append(sh.row_values(0))
for i in range(1,shrows):
dlist.append(sh.row_values(i))
conn=MySQLdb.connect(host=dbhost,user=dbuname,passwd=dbpwd,db=dbname,charset='utf8')
cursor=conn.cursor()
#create table
sqlstr="create table " + tablenames + "("+fo[0][0]+" varchar(100));"
#cursor.execute("create table " +tablenames + " ("+fo[0][0]+" varchar(100));")
cursor.execute(sqlstr)
#UPDATE TABLES
for i in range(1,shcols):
cursor.execute("alter table " +tablenames+" add "+fo[0][i]+" varchar(100);")
val=''
for i in range(0,shcols):
val = val+'%s,'
cursor.executemany("insert into " + tablenames + " values("+val[:-1]+");" ,dlist)
conn.commit()
執行SQL的實現:
def mysqlexecsqlstr(dbHost,dbUser,dbPasswd,dbName,sqlstr):
db = MySQLdb.connect(dbHost,dbUser,dbPasswd,dbName,charset='utf8' )
cursor = db.cursor()
try:
cursor.execute(sqlstr)
db.commit()
except:
db.rollback()
db.close()
和前面一樣,前端把引數傳遞到後臺就能實現了