# 数据库管理系统(简易版) **Repository Path**: lucze/database-management-system ## Basic Information - **Project Name**: 数据库管理系统(简易版) - **Description**: 根据老师给的简易版管理器进行修改,增加功能,并模块化,包含SQLite,MySQL,SQLServer三种连接,SqlServer回滚测试失败 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-15 - **Last Updated**: 2025-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数据库管理工具功能说明文档 版本: 2.0 开发环境: Python 3.8+ / PyQt5 支持数据库: MySQL 8.0+ / SQLite3 / SQL Server 2012+ ## 目录 1. [项目概述](#1-项目概述) 2. [核心功能模块](#2-核心功能模块) 3. [文件架构与实现细节](#3-文件架构与实现细节) 4. [设计思想与技术选型](#4-设计思想与技术选型) 5. [使用说明](#5-使用说明) ## 1. 项目概述 本数据库管理工具是一个跨平台、多数据库支持的图形化管理系统,旨在为课程作业提供类似 Navicat 的核心功能。系统采用分层架构设计,将界面交互、业务逻辑与数据访问解耦,实现了 MySQL、SQLite、SQL Server 三种数据库的统一管理。 核心特性: - 三库兼容:通过抽象适配器模式屏蔽数据库差异 - 可视化操作:提供连接配置、SQL编辑、结果展示、对象管理一体化界面 - 数据迁移:支持完整数据库的导入导出(结构+数据) - 视图分析:基于 sqlglot 实现视图依赖关系解析与展示 - 错误容忍:导入导出时支持跳过错误记录并记录详细日志 ## 2. 核心功能模块 ### 2.1 数据库连接管理模块 **功能描述**:统一管理三种数据库的连接生命周期,提供连接测试、参数配置与状态监控。 **实现文件**:ui/connection_panel.py **使用方法**:通过下拉框切换数据库类型,动态显示对应参数输入区域(MySQL 需要主机/端口/用户名/密码,SQLite 仅需文件路径,SQL Server 需要服务器/认证信息)。点击"连接数据库"后,系统底层会自动检测 ODBC 驱动并建立连接。 **效果**:连接成功后状态栏变绿并显示数据库类型,左侧对象树自动刷新;断开连接后自动清理资源并禁用相关操作按钮。 ### 2.2 SQL 执行与编辑器模块 **功能描述**:提供语法高亮的 SQL 编辑器,支持多条语句批量执行、查询历史管理、结果表格展示。 **实现文件**:ui/sql_editor.py + ui/result_table.py **实现方法**:使用 PyQt5 的 QTextEdit 作为编辑器基底,通过 QSyntaxHighlighter 实现关键字、字符串、注释的着色。执行时按分号分割语句(智能处理字符串中的分号),查询语句返回结果集,DML 语句返回影响行数,DDL 语句执行后自动刷新对象树。 **效果**:编辑器支持 F5 快捷键执行、Ctrl+/ 注释选中行;结果表格自动调整列宽,支持右键复制单元格或整行;查询历史对话框可快速复用之前执行过的 SQL。 ### 2.3 数据库对象树模块 **功能描述**:以树形结构展示当前连接数据库中的所有表与视图,支持双击打开、右键菜单操作。 **实现文件**:集成在 ui/main_window.py 的对象树组件 **设计思路**:将表和视图分为两个顶层节点,每个节点显示对象名称。双击表节点时,自动生成 SELECT * FROM table LIMIT 100 语句并执行;右键菜单提供"查看表结构"(不同数据库调用 DESC/PRAGMA/sp_columns)、"导出表"、"删除表"等操作;右键视图节点时提供"视图溶解"入口。 **效果**:用户无需手动编写基础查询语句,通过可视化交互即可快速浏览数据。 ### 2.4 导入导出功能模块 **功能描述**:支持将数据库完整迁移到 SQL 文件,或将外部数据(SQL/CSV)导入当前数据库。 #### 导出功能 **实现文件**:ui/export_dialog.py + utils/sql_generator.py **实现方法**:用户可选择导出范围(完整数据库、单表、仅结构、仅数据)。点击"开始导出"后,后台线程会逐个表获取 DDL 语句,若选择包含数据,则分批次读取表数据并生成 INSERT 语句。对于 SQL Server,自动生成 IDENTITY 语法;对于 MySQL/SQLite,生成 AUTO_INCREMENT 语法。 **效果**:生成标准 SQL 文件,可在同类型或其他类型数据库中重新执行实现迁移。导出过程显示进度条与实时日志,支持中断操作。 #### 导入功能 **实现文件**:ui/import_dialog.py + ui/import_dialog.py 中的 ImportThread **实现方法**: - SQL 文件导入:按分号分割语句,逐条执行,支持遇到错误时跳过并继续 - CSV 文件导入:提供字段映射对话框,允许用户将 CSV 列映射到数据库表字段,跳过无关列。读取 CSV 数据后按批次生成 INSERT 语句,主键冲突时自动跳过并记录日志 **效果**:实现异构数据源的快速入库,教学场景下的小数据量导入可在数秒内完成,错误日志清晰明了。 ### 2.5 视图溶解功能模块 **功能描述**:解析视图的定义 SQL,提取其依赖的基础表,并以树形图展示依赖关系,同时显示改写后的查询语句。 **实现文件**:ui/view_dissolve_dialog.py + utils/view_parser.py **技术选型**:采用 sqlglot 库进行 SQL 解析。该库支持 MySQL、SQLite、SQL Server 三种方言,能将 CREATE VIEW 语句解析为抽象语法树(AST),从中提取 FROM 和 JOIN 子句涉及的表名。 **实现流程**: 1. 根据数据库类型调用相应系统表获取视图定义(MySQL 的 SHOW CREATE VIEW、SQLite 的 sqlite_master、SQL Server 的 OBJECT_DEFINITION) 2. 使用 sqlglot 解析定义 SQL,定位查询主体部分 3. 遍历 AST 中所有 Table 节点,收集表名 4. 判断依赖对象是表还是视图(通过查询数据库元数据) 5. 构建两层树结构(根节点为视图,子节点为依赖表/视图) 6. 在右侧文本框展示改写后的查询 SQL(移除 CREATE VIEW ... AS 部分) **效果**:帮助用户理解视图底层数据来源,适用于教学场景下的数据库原理演示。 ## 3. 文件架构与实现细节 ### 3.1 程序入口层 **文件**:main.py **作用**:配置 Python 模块搜索路径,初始化 QApplication,启动主窗口 **设计考虑**:通过动态修改 sys.path 解决相对导入问题,确保项目在任何路径下均可运行 ### 3.2 UI 层 | 文件 | 功能 | 关键组件 | 使用的库 | |------|------|----------|----------| | main_window.py | 整合所有 UI 组件,提供菜单栏、工具栏、状态栏 | QMainWindow, QSplitter, QTreeWidget | PyQt5.QtWidgets, PyQt5.QtCore | | connection_panel.py | 数据库连接配置与状态管理 | QGroupBox, QFormLayout, QComboBox | PyQt5.QtWidgets | | sql_editor.py | SQL 输入、语法高亮、历史管理 | QTextEdit, QSyntaxHighlighter, QDialog | PyQt5.QtWidgets, PyQt5.QtGui | | result_table.py | 查询结果表格展示与交互 | QTableWidget, QMenu | PyQt5.QtWidgets | | import_dialog.py | SQL/CSV 导入配置与执行监控 | QDialog, QProgressBar, QThread | PyQt5.QtWidgets, PyQt5.QtCore | | export_dialog.py | 导出配置与进度显示 | QDialog, QProgressBar, QThread | PyQt5.QtWidgets, PyQt5.QtCore | | view_dissolve_dialog.py | 视图依赖树与 SQL 重写展示 | QDialog, QTreeWidget, QTextEdit, QThread | PyQt5.QtWidgets, PyQt5.QtCore | 共用的 Qt 信号机制:所有耗时操作(连接、执行、导入导出、解析)均使用 QThread 实现,通过 pyqtSignal 向 UI 线程发送进度、日志、结果数据,避免界面卡顿。 ### 3.3 数据库适配层 | 文件 | 功能 | 实现要点 | 依赖库 | |------|------|----------|--------| | base_adapter.py | 定义抽象基类,统一接口规范 | ABC 抽象方法,类型注解 | abc, typing | | mysql_adapter.py | MySQL 连接与操作实现 | pymysql 驱动,DictCursor 返回字典结果集 | pymysql | | sqlite_adapter.py | SQLite 连接与操作实现 | sqlite3 内置库,设置 row_factory 为 Row 对象 | sqlite3 | | sqlserver_adapter.py | SQL Server 连接与操作实现 | pyodbc 驱动,自动检测可用 ODBC 驱动版本 | pyodbc | 设计模式:采用适配器模式,新增数据库类型只需继承 DatabaseAdapter 并实现抽象方法,无需修改上层 UI 代码。 连接字符串处理:SQL Server 适配器自动检测 ODBC Driver 17/18 for SQL Server 或 SQL Server Native Client,动态构建连接字符串,用户无需手动配置驱动名称。 ### 3.4 工具层 | 文件 | 功能 | 核心方法 | 依赖库 | |------|------|----------|--------| | sql_generator.py | 生成 DDL 与 INSERT 语句,跨库转换 | generate_full_export(), _simple_ddl_convert() | typing | | view_parser.py | 使用 sqlglot 解析视图依赖 | parse_view_dependencies(), build_dependency_tree() | sqlglot, typing | 职责分离:sql_generator 负责数据导出与语法转换,view_parser 负责视图解析与依赖分析,两者均持有数据库适配器实例以获取元数据。 ## 4. 设计思想与技术选型 ### 4.1 分层解耦思想 - 表现层:PyQt5 负责界面渲染与用户交互 - 业务层:SQLGenerator、ViewParser 封装核心业务逻辑 - 数据层:DatabaseAdapter 抽象数据库操作 - 优势:各层可独立测试,修改 UI 不影响数据访问逻辑,更换数据库仅需新增适配器实现类 ### 4.2 错误处理策略 - 底层:捕获数据库原生异常,转换为通用 DatabaseError,附带数据库类型信息 - 中层:记录错误日志,根据用户配置(继续/中断)决定流程 - 顶层:UI 弹窗显示友好提示,不暴露技术细节 ### 4.3 性能考虑 - 分块读取:导出时限制单次读取行数(默认 1000 行),INSERT 语句按批次(50 行)生成,避免内存溢出 - 懒加载:对象树仅在连接成功后刷新,不主动缓存元数据 - 线程隔离:每个耗时操作独立线程,主线程仅更新界面 ### 4.4 友好设计 - 代码简洁:避免过度设计,每个方法不超过 50 行,便于理解 - 注释充分:关键逻辑均配有中文注释 - 默认安全:所有破坏性操作(删除表、覆盖数据)均有二次确认 - 日志透明:所有执行过程实时显示,便于调试 ## 5. 使用说明 ### 5.1 环境准备 ```bash # 安装依赖 pip install -r requirements.txt # 若使用 SQL Server,需额外安装 ODBC 驱动 # 下载地址: `https://docs.microsoft.com/sql/connect/odbc/download-odbc-driver` ``` ### 5.2 快速开始 1. 运行 `python db_manager/main.py` 启动程序 2. 在连接面板选择数据库类型(MySQL/SQLite/SQL Server) 3. 填写连接参数,点击"测试连接"验证 4. 点击"连接数据库",左侧对象树自动加载 5. 双击表名可快速查询,在 SQL 编辑器编写语句后按 F5 执行 6. 通过菜单"文件→导入/导出"进行数据迁移 7. 在视图节点右键选择"视图溶解"分析依赖关系 ### 5.3 测试数据使用 运行 `tests/create_test_database.py` 可自动生成包含 3 表 2 视图及测试数据的数据库,用于验证功能。