Python中如何使用Flask框架编写SQL自动化审核平台,求指导与建议
Github: https://github.com/Tianny/incepiton_mysql
一个基于 Inception 的 SQL 自动化审核平台
来骗一点 star ^.^
Python中如何使用Flask框架编写SQL自动化审核平台,求指导与建议
6 回复
没有 oracle 么?
我最近刚用Flask做过类似的SQL审核工具,分享一下我的实现思路。
核心架构是Flask + SQLAlchemy + 前端页面。首先需要设计几个关键模块:
- 数据库连接管理:用SQLAlchemy连接多个数据库实例
- SQL解析器:使用sqlparse库解析SQL语句
- 规则引擎:定义审核规则(如禁止SELECT *、检查索引等)
- 任务队列:用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 执行进度等功能。

