1. 程式人生 > >DJANGO專案用WEB的方式對MYSQL資料庫進行備份匯出等管理任務的實現

DJANGO專案用WEB的方式對MYSQL資料庫進行備份匯出等管理任務的實現

環境: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()

 

和前面一樣,前端把引數傳遞到後臺就能實現了