基于Python flask-sqlalchemy的SQLServer数据库管理平台
适应场景:
主要用于帮助DBA自动化很多日常工作,包括:
- 数据库状态监控
- 性能问题诊断
- 日志分析
- 自动巡检
- 问题告警
系统截图:


main.py
from flask import Blueprint, render_template, request, flash, redirect, url_for
from flask_login import login_required
from app.models.datasource import DataSource
from app import dbbp = Blueprint('main', __name__)@bp.route('/')
@login_required
def index():datasources = DataSource.query.all()return render_template('index.html', datasources=datasources)@bp.route('/datasource', methods=['GET', 'POST'])
@login_required
def datasource_list():datasources = DataSource.query.all()return render_template('datasource/list.html', datasources=datasources)@bp.route('/datasource/add', methods=['GET', 'POST'])
@login_required
def datasource_add():if request.method == 'POST':try:datasource = DataSource(name=request.form['name'],host=request.form['host'],port=int(request.form['port']),database=request.form['database'],username=request.form['username'],password=request.form['password'])db.session.add(datasource)db.session.commit()flash('数据源添加成功', 'success')return redirect(url_for('main.datasource_list'))except Exception as e:flash(f'添加失败: {str(e)}', 'danger')return render_template('datasource/form.html')@bp.route('/datasource/edit/<int:id>', methods=['GET', 'POST'])
@login_required
def datasource_edit(id):datasource = DataSource.query.get_or_404(id)if request.method == 'POST':try:datasource.name = request.form['name']datasource.host = request.form['host']datasource.port = int(request.form['port'])datasource.database = request.form['database']datasource.username = request.form['username']if request.form['password']: # 只在提供新密码时更新datasource.password = request.form['password']db.session.commit()flash('数据源更新成功', 'success')return redirect(url_for('main.datasource_list'))except Exception as e:flash(f'更新失败: {str(e)}', 'danger')return render_template('datasource/form.html', datasource=datasource)@bp.route('/datasource/delete/<int:id>')
@login_required
def datasource_delete(id):datasource = DataSource.query.get_or_404(id)try:db.session.delete(datasource)db.session.commit()flash('数据源删除成功', 'success')except Exception as e:flash(f'删除失败: {str(e)}', 'danger')return redirect(url_for('main.datasource_list'))@bp.route('/datasource/toggle/<int:id>')
@login_required
def datasource_toggle(id):datasource = DataSource.query.get_or_404(id)try:datasource.is_active = not datasource.is_activedb.session.commit()flash('状态更新成功', 'success')except Exception as e:flash(f'更新失败: {str(e)}', 'danger')return redirect(url_for('main.datasource_list'))
monitor.py
from flask import Blueprint, render_template, jsonify
from flask_login import login_required
from app.models.datasource import DataSource
from app.services.monitor_service import MonitorServicebp = Blueprint('monitor', __name__, url_prefix='/monitor')@bp.route('/status/<int:id>')
@login_required
def status(id):datasource = DataSource.query.get_or_404(id)status = MonitorService.get_database_status(id)return render_template('monitor/status.html', datasource=datasource, status=status)@bp.route('/api/status/<int:id>')
@login_required
def api_status(id):status = MonitorService.get_database_status(id)return jsonify(status)
monitor_service.py
# import pyodbc # 暂时注释掉
from app.models.datasource import DataSource
import datetimeclass MonitorService:@staticmethoddef get_database_status(datasource_id):datasource = DataSource.query.get(datasource_id)if not datasource:return None# 模拟获取更丰富的数据库状态信息return {'basic_info': {'database_id': 1,'name': datasource.database,'state': 'ONLINE','recovery_model': 'FULL','compatibility_level': '150','collation': 'Chinese_PRC_CI_AS','created_time': '2023-01-01 08:00:00','last_backup_time': '2024-03-10 03:00:00'},'size_info': {'data_size': '1024 MB','log_size': '256 MB','total_size': '1280 MB','data_space_used': 75.5, # 百分比'log_space_used': 45.2, # 百分比'unallocated_space': '512 MB'},'performance': {'cpu_usage': 35.5, # 百分比'memory_usage': 4096, # MB'buffer_cache_hit': 98.5, # 百分比'page_life_expectancy': 1200, # 秒'batch_requests': 450, # 每秒'user_connections': 85,'active_transactions': 12,'blocked_processes': 0,'deadlocks': 0,'lock_waits': 2},'io_stats': {'reads_per_sec': 250,'writes_per_sec': 120,'io_pending': 0,'io_stall_ms': 150,'read_latency_ms': 3,'write_latency_ms': 5},'availability': {'uptime': '15 days 6 hours','last_restart': '2024-02-25 00:00:00','failovers_last_24h': 0,'mirror_status': 'Not Configured'},'alerts': [{'type': 'warning','message': '数据文件空间使用率超过75%','time': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}]}@staticmethoddef get_database_status_real(datasource_id):datasource = DataSource.query.get(datasource_id)if not datasource:return Noneconn_str = (f"DRIVER={{ODBC Driver 17 for SQL Server}};"f"SERVER={datasource.host},{datasource.port};"f"DATABASE={datasource.database};"f"UID={datasource.username};"f"PWD={datasource.password}")try:conn = pyodbc.connect(conn_str)cursor = conn.cursor()# 获取数据库状态cursor.execute("""SELECT database_id,name,state_desc,recovery_model_desc,total_size = str(size*8/1024)+' MB'FROM sys.databasesWHERE name = ?""", datasource.database)status = cursor.fetchone()# 获取性能指标cursor.execute("""SELECT TOP 1cpu_time,total_worker_time,total_physical_reads,total_logical_writes,total_logical_readsFROM sys.dm_exec_query_statsORDER BY total_worker_time DESC""")performance = cursor.fetchone()return {'status': {'database_id': status[0],'name': status[1],'state': status[2],'recovery_model': status[3],'size': status[4]},'performance': {'cpu_time': performance[0],'worker_time': performance[1],'physical_reads': performance[2],'logical_writes': performance[3],'logical_reads': performance[4]}}except Exception as e:return {'error': str(e)}finally:if 'conn' in locals():conn.close()
相关文章:
基于Python flask-sqlalchemy的SQLServer数据库管理平台
适应场景: 主要用于帮助DBA自动化很多日常工作,包括: 数据库状态监控 性能问题诊断 日志分析 自动巡检 问题告警 系统截图: main.py from flask import Blueprint, render_template, request, flash, redirect, url_for f…...
npm运行Vue项目报错 error:0308010c:digital envelope routines::unsupported
大家好,我是 程序员码递夫。 问题 VSCode 运行Vue项目,提示错误: building 2/2 modules 0 activeError: error:0308010c:digital envelope routines::unsupported 解决方法 原因是 npm 高版本(大于17),对ssl的处理做了改进&…...
计数排序
目录 计数排序原理和步骤: 完整代码实现: 计数排序原理和步骤: 当一段数据比较集中在一个范围,比如 98,95,98,91,90,93,94,97,93&…...
MyBatis拦截器终极指南:从原理到企业级实战
在本篇文章中,我们将深入了解如何编写一个 MyBatis 拦截器,并通过一个示例来展示如何在执行数据库操作(如插入或更新)时,自动填充某些字段(例如 createdBy 和 updatedBy)信息。本文将详细讲解拦…...
Pythong 解决Pycharm 运行太慢
Pythong 解决Pycharm 运行太慢 官方给Pycharm自身占用的最大内存设低估了限制,我的Pycharm刚开始默认是256mb。 首先找到自己的Pycharm安装目录 根据合适自己的改 保存,重启Pycharm...
双ESP8266-01S通讯UDP配置
第一台ESP8266(发送命令需要勾---发送新行) ATCWMODE3 ATCWSAP_DEF"CAR_wifi_Master","12345678",5,3 //设置本地wifi名称以及密码 ATCIPSTA_DEF"192.168.4.1" //设置本地IP ATCIFSR …...
Molecular Communication(分子通信)与 Molecular Semantic Communication(分子语义通信)
1. 引言 随着传统无线通信在极端环境(如微观生物体内、海洋深处)中的局限性凸显,分子通信(Molecular Communication, MC)成为一种新型通信范式。分子通信通过分子作为信息载体,在纳米尺度上传输信息&#…...
Cookie:网页浏览背后的“小秘密”
在现代互联网的世界里,Cookie 是一个几乎无处不在的概念。它不仅影响着我们的网页浏览体验,还在背后默默地支持着许多网站的功能和服务。本文将带你全面了解 Cookie 的原理、作用、安全性以及如何管理它们。 一、什么是 Cookie? Cookie 是一…...
日语学习-日语知识点小记-构建基础-JLPT-N4N5阶段(6):動詞ない形について句型
日语学习-日语知识点小记-构建基础-JLPT-N4&N5阶段(6):動詞ない形について句型 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)~動詞な形 +なければなりません(2)~動詞な形 + なくてもいいです(3)に まで までに :区別3、单词(1)日语单词…...
华纳云:如何从服务器日志中发现僵尸进程?
在 CentOS 系统中,僵尸进程通常指那些已经完成执行但仍然在进程表中存在的进程。它们没有实际的执行,但仍然占用系统资源,通常会出现在父进程没有及时回收子进程的状态下。虽然僵尸进程本身不消耗 CPU 或内存资源,但它们会占用进程…...
fastadmin 接口请求提示跨域
问题描述 小程序项目,内嵌h5页面,在h5页面调用后端php接口,提示跨域。网上查找解决方案如下: 1,设置header // 在入口文件index.php直接写入直接写入 header("Access-Control-Allow-Origin:*"); header(&q…...
NHANES指标推荐:DDA!
文章题目:Association of dietary decanoic acid intake with diabetes or prediabetes: an analysis from NHANES 2005-2016 DOI:10.3389/fnut.2024.1483045 中文标题:饮食中癸酸摄入量与糖尿病或糖尿病前期的关系:2005-2016 年 …...
用大模型学大模型04-模型与网络
目前已经学完深度学习的数学基础,开始学习各种 模型和网络阶段,给出一个从简单到入门的,层层递进的学习路线。并给出学习每种模型需要的前置知识。增加注意力机制,bert, 大模型,gpt, transformer, MOE等流行…...
PostgreSQL 数据库压力测试指南
一、为什么需要压力测试? 数据库需要进行压力测试的原因主要包括以下几个方面: 性能评估:通过压力测试,可以了解数据库在高负载情况下的性能表现,包括响应时间、吞吐量和资源利用率等。这有助于确定系统的性能瓶颈。 …...
oppo,康冠科技25届春招内推
oppo,康冠科技25届春招内推 ①康冠科技25届春招 【职位】算法、软件、硬件、技术,结构设计,供应链,产品,职能,商务 【一键内推】https://sourl.cn/2Mm9Lk 【内推码】EVBM88 ②OPPO 2025届春招内推 招聘岗位…...
元学习之孪生网络Siamese Network
简介:元学习是一种思想,一般以神经网络作为特征嵌入的工具,实现对数据特征的提取,然后通过构造某种指标以引导优化器对模型参数进行优化。而最小化距离是最常见的学习目标,这就是熟知的度量学习,度量学习里…...
Python----PyQt开发(PyQt高级:组件大小,界面位置,按钮,文本显示,文本输入,字体大小)
一、大小 setMinimumSize(width, height) 描述: 设置控件的最小尺寸。控件不会被缩小到比这个尺寸更小的大小。 参数: width: 最小宽度(以像素为单位)。 height: 最小高度(以像素为单位)。 button.setMinimumSize(100, …...
qt + opengl 给立方体增加阴影
在前几篇文章里面学会了通过opengl实现一个立方体,那么这篇我们来学习光照。 风氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子: 1 环境光照(Ambient …...
vue2老版本 npm install 安装失败_安装卡主
vue2老版本 npm install 安装失败_安装卡主 特别说明:vue2老版本安装慢、运行慢,建议升级vue3element plus vite 解决方案1: 第一步、修改npm 镜像为国内镜像 使用淘宝镜像: npm config set registry https://registry.npmmir…...
20250213编译飞凌的OK3588-C_Linux5.10.209+Qt5.15.10_用户资料_R1
20250213编译飞凌的OK3588-C_Linux5.10.209Qt5.15.10_用户资料_R1 2025/2/13 11:43 缘起:飞凌发布了高版本内核的适配OK3588-C的Buildroot的SDK:OK3588-C_Linux5.10.209Qt5.15.10_用户资料_R1。 但是编译异常了。 于是按照百度升级libc6,可以…...
中望CAD c#二次开发 ——VS环境配置
新建类库项目:下一步 下一步 下一步: 或直接: 改为: <Project Sdk"Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>NET48</TargetFramework> <LangVersion>pr…...
【Elasticsearch】词干提取(Stemming)
词干提取是将一个词还原为其词根形式的过程。这确保了在搜索过程中,一个词的不同变体能够匹配到彼此。 例如,walking(行走)和walked(走过)可以被还原到同一个词根walk(走)。一旦被还…...
Rander压力测试监测,更改服务端资源node
测试策略 压力测试, 目前是本地VM的资源不够,导致压力瓶颈,目前本地的VM,CPU是6个,可以增加到8个,服务端目前资源利用率没有达到最高点 we are now using 3 nodes with 3 pods, therefore, we need the …...
Go语言实现十大排序算法超细节图片讲解
基础排序 冒泡排序 将序列中的元素进行两两比较,将大的元素移动到序列的末尾。 平均时间复杂度是O(n^2),最坏时间复杂度是O(n^2),最好时间复杂度是O(n),排序结果具有稳定性,空间复杂度是O(1)。 这里所说的稳定性是针对…...
linux-centos等测试环境做压力测试
一, jmeter环境安装 1, jdk下载安装 因为jmeter使用Java写的测试工具,应用需要jdk环境支持. yum -y install java-1.8.0-openjdk* 注意:【jdk和*通配符之间不能敲空格,有空格不能匹配所有的子文件】【安装过程中需要等待它执行完成,不要中…...
Django中实现可靠的定时任务调度系统
在许多Web应用程序中,定时任务是一个常见的需求。无论是数据同步、报告生成还是定期维护,都需要一个可靠的调度系统。本文将介绍如何在Django项目中实现一个强大的定时任务调度系统,该系统不仅能够按时执行任务,还能处理分布式环境中的并发问题。 1. 概述 我们将使用以下…...
【鸿蒙Next】写入沙箱的日志文件如何查看
demo案例:https://gitee.com/pengyoucongcode/TxtEdit 文章参考:https://blog.csdn.net/qq_42896653/article/details/144782468...
网页五子棋——通用模块
目录 项目创建 通用功能模块 错误码 自定义异常类 CommonResult jackson 加密工具 项目创建 使用 idea 创建 SpringBoot 项目,并引入相关依赖: 配置 MyBatis: 编辑 application.yml: spring:datasource: # 数据库连接配…...
第6章 6.2使用ASP.NET Core 开发WebAPI ASP.NET Core Web API
6.2.1 Web API项目的搭建 进入VS,【创建新项目】,选择【ASP.NET Core Web API】模板,【下一步】,编辑项目名称及项目位置,【下一步】,选择框架,其他选项默认即可,【创建】。 进入项…...
[MFC] 使用控件
介绍如何使用控件,以及如何获取控件中的数值 check Box 添加点击事件,即选中和取消选中触发的事件 第一种方式是按照如下方式第二种方式是直接双击点击进去 void CMFCApplication1Dlg::OnBnClickedCheckSun() {// TODO: 在此添加控件通知处理程序代…...
