Python中如何使用Flask框架编写SQL自动化审核平台,求指导与建议

Github: https://github.com/Tianny/incepiton_mysql

一个基于 Inception 的 SQL 自动化审核平台

来骗一点 star ^.^
Python中如何使用Flask框架编写SQL自动化审核平台,求指导与建议

6 回复

没有 oracle 么?


我最近刚用Flask做过类似的SQL审核工具,分享一下我的实现思路。

核心架构是Flask + SQLAlchemy + 前端页面。首先需要设计几个关键模块:

  1. 数据库连接管理:用SQLAlchemy连接多个数据库实例
  2. SQL解析器:使用sqlparse库解析SQL语句
  3. 规则引擎:定义审核规则(如禁止SELECT *、检查索引等)
  4. 任务队列:用Celery处理异步审核任务

这是基础的项目结构:

# app/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from celery import Celery

db = SQLAlchemy()
celery = Celery()

def create_app():
    app = Flask(__name__)
    app.config.from_object('config.Config')
    
    db.init_app(app)
    celery.conf.update(app.config)
    
    from .routes import main
    app.register_blueprint(main)
    
    return app
# app/models.py
from datetime import datetime
from app import db

class AuditRule(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    rule_name = db.Column(db.String(100))
    rule_type = db.Column(db.String(50))  # 语法检查、性能检查等
    pattern = db.Column(db.Text)  # 正则表达式或规则描述
    severity = db.Column(db.String(20))  # 高、中、低
    is_active = db.Column(db.Boolean, default=True)
    
class AuditTask(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    sql_content = db.Column(db.Text)
    db_instance = db.Column(db.String(100))
    status = db.Column(db.String(20))  # pending, running, completed
    result = db.Column(db.JSON)  # 审核结果
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
# app/services/audit_service.py
import sqlparse
import re
from typing import List, Dict

class SQLAuditor:
    def __init__(self):
        self.rules = self._load_rules()
    
    def _load_rules(self) -> List[Dict]:
        """从数据库加载审核规则"""
        return [
            {
                'name': '禁止SELECT *',
                'pattern': r'SELECT\s+\*',
                'message': '建议明确指定查询字段',
                'severity': 'warning'
            },
            {
                'name': '检查LIMIT',
                'pattern': r'SELECT.*(?<!LIMIT\s+\d+)',
                'message': '大数据量查询建议添加LIMIT',
                'severity': 'info'
            }
        ]
    
    def audit_sql(self, sql: str) -> List[Dict]:
        """执行SQL审核"""
        results = []
        parsed = sqlparse.parse(sql)
        
        for statement in parsed:
            for rule in self.rules:
                if re.search(rule['pattern'], str(statement), re.IGNORECASE):
                    results.append({
                        'rule': rule['name'],
                        'message': rule['message'],
                        'severity': rule['severity'],
                        'position': statement.token_first().position
                    })
        
        return results
# app/routes.py
from flask import Blueprint, request, jsonify
from app.services.audit_service import SQLAuditor
from app.tasks import audit_task

main = Blueprint('main', __name__)
auditor = SQLAuditor()

@main.route('/audit', methods=['POST'])
def audit_sql():
    """同步审核接口"""
    data = request.json
    sql = data.get('sql')
    
    if not sql:
        return jsonify({'error': 'SQL内容不能为空'}), 400
    
    results = auditor.audit_sql(sql)
    return jsonify({'results': results})

@main.route('/audit/async', methods=['POST'])
def audit_sql_async():
    """异步审核接口"""
    data = request.json
    task = audit_task.delay(data['sql'], data.get('db_instance'))
    return jsonify({'task_id': task.id})
# app/tasks.py
from app import celery
from app.services.audit_service import SQLAuditor

@celery.task
def audit_task(sql: str, db_instance: str = None):
    """异步审核任务"""
    auditor = SQLAuditor()
    return auditor.audit_sql(sql)

前端可以用简单的HTML+JavaScript实现,或者用Vue/React。核心功能包括:

  • SQL输入框(支持语法高亮)
  • 审核规则配置界面
  • 审核结果展示表格
  • 历史记录查询

关键点是要做好SQL解析和规则匹配,可以考虑集成更专业的SQL解析库如moz-sql-parser。另外建议添加SQL格式化、执行计划分析等功能。

总结:先实现核心审核逻辑,再逐步完善前后端功能。

暂时不支持。因为操作 sql 主要用了中间件 Inception,它只支持 MySQL -。-

改天试试,感谢分享。

star 了!看了蛮有意思的,一般用来做什么的?定时统计?有哪些应用场景?

谢谢。给 DBA 用的。开发提的上线 SQL 语句会先交给 inception 自动审核,审核通过, 再由 DBA 人工审核。支持分表操作、定时执行、回滚、实时获取 sql 执行进度等功能。

回到顶部