python+django自动化平台(一键执行sql) 前端vue-element展示

一、开发环境搭建和配置

复制代码
pip install mysql-connector-python

pip install PyMySQL

二、django模块目录

复制代码
dbOperations
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-313.pyc
│   ├── admin.cpython-313.pyc
│   ├── apps.cpython-313.pyc
│   ├── models.cpython-313.pyc
│   └── views.cpython-313.pyc
├── admin.py
├── apps.py
├── migrations
│   ├── __init__.py
│   └── __pycache__
│       └── __init__.cpython-313.pyc
├── models.py
├── tests.py
└── views.py

三、django模块相关代码

复制代码
***************************settings.py*********************************************

#数据库 连接配置 mysql
DATABASES = {
    'default': {
        # 数据库引擎
        'ENGINE': 'django.db.backends.mysql',
        # 'ENGINE': 'sqlalchemy.create_engine',
        # 数据库名字
        'NAME': 'xx',
        # 数据库用户名
        'USER': 'xx',
        # 数据库密码
        'PASSWORD': 'xx',
        # 数据库主机地址
        'HOST': 'xx',
        # 数据库端口号
        'PORT': 'xx'
    }
}

************************************urls************************************


urlpatterns = [
  path('dbOperations/executeSQLView', db_views.executeSQLView,name='execute_sql_view'),
]

**************************************viwes.py************************************

import json
import logging

from django.db import connection
from django.http import JsonResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status

from operation.common.enum.ResponeCodeEnum import ResponseCodeEnum
from operation.common.exception.BusinessException import BusinessException
from operation.common.utils.CommonResult import CommonResult
from operation.common.utils.Serializers import SQLExecutionSerializer


# Create your views here.


from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.db import connection
import logging
from rest_framework import status
import json

@csrf_exempt
def executeSQLView(request):
    try:
        if request.method == 'POST':
            json_data = request.body
            print(json_data)
            data = json.loads(json_data)
            sql = data.get('sql', None)
            # 序列化器的正确使用:在 serializer = SQLExecutionSerializer(data={'sql': sql}) 中,
            # 我们传递了一个包含 sql 键的字典,而不是直接传递 SQL 查询字符串。
            serializer = SQLExecutionSerializer(data={'sql': sql})
            if serializer.is_valid():
                sql = serializer.validated_data['sql']
                logging.info("sql:%s" % (sql))
                """
                    使用 with 语句管理游标
                """
                with connection.cursor() as cursor:
                    try:
                        # 执行 SQL 查询:
                        cursor.execute(sql)
                        results = cursor.fetchall()
                        # 处理查询结果:
                        columns = [col[0] for col in cursor.description]
                        # 将查询结果转换为字典列表,每个字典表示一行数据。
                        data = [dict(zip(columns, row)) for row in results]
                        return JsonResponse(CommonResult.success_data(data), json_dumps_params={'ensure_ascii': False})
                    except Exception as e:
                        # return JsonResponse(CommonResult.error(e.code, e.message),
                        #                     json_dumps_params={'ensure_ascii': False})
                        raise BusinessException(e.message, e.code)
            return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            raise BusinessException(ResponseCodeEnum.METHOD_ERROR.message, ResponseCodeEnum.METHOD_ERROR.code)
    except BusinessException as e:
        return JsonResponse(CommonResult.error(e.code, e.message), json_dumps_params={'ensure_ascii': False})

四、前端代码

复制代码
<template>
  <div class="app-container">
    <el-card shadow="always">
      <el-row :gutter="24">
        <el-input v-model="sqlParam.sql" type="textarea" :rows="10" placeholder="请输入SQL查询" />
        <el-button type="primary" @click="executeSQL">执行</el-button>
      </el-row>
    </el-card>

    <el-card shadow="always">

      <el-table v-if="data.length > 0" :data="data" style="width: 100%">
        <el-table-column v-for="key in Object.keys(data[0])" :key="key" :prop="key" :label="key" />
      </el-table>

    </el-card>
  </div>
</template>

<script>
import {
  executeSQLView
} from '@/api/dataBase/database-request'

export default {
  data() {
    return {
      sqlParam: { // 输入框给出默认值
        sql: ''
      },
      data: [],
      error: ''
    }
  },
  methods: {
    executeSQL() {
      this.dataLoading = true
      console.log('请求参数:' + this.sqlParam)
      executeSQLView(this.sqlParam).then((res) => {
        // alert(JSON.stringify(res.data.data))
        this.data = res.data.data
        setTimeout(() => { // 超过指定超时时间  关闭查询的转圈的loading加载动画
          this.listLoading = false
        }, 1.5 * 1000)
      })
    }
  }
}
</script>

<style>
</style>

五、运行效果

相关推荐
Rabbit_QL21 小时前
【水印添加工具】从零设计一个工程级 Python 图片水印工具:WaterMask 架构与实现
开发语言·python
曲幽1 天前
FastAPI多进程部署:定时任务重复执行?手把手教你用锁搞定
redis·python·fastapi·web·lock·works
森屿~~1 天前
AI 手势识别系统:踩坑与实现全记录 (PyTorch + MediaPipe)
人工智能·pytorch·python
运维行者_1 天前
2026 技术升级,OpManager 新增 AI 网络拓扑与带宽预测功能
运维·网络·数据库·人工智能·安全·web安全·自动化
忧郁的橙子.1 天前
26期_01_Pyhton文件的操作
开发语言·python
小唐同学爱学习1 天前
如何解决海量数据存储
java·数据库·spring boot·mysql
小白爱运维1 天前
MySQL升级8.0.44后登录报错-系统表不支持'MyISAM'存储引擎
数据库·mysql
小CC吃豆子1 天前
Python爬虫
开发语言·python
June bug1 天前
(#字符串处理)字符串中第一个不重复的字母
python·leetcode·面试·职场和发展·跳槽
lixzest1 天前
PyTorch基础知识简述
人工智能·pytorch·python