项目概述
本文介绍一个基于PyQt5框架开发的SQLite数据库可视化管理系统,主要用于管理记录数据。该系统采用MVC架构,实现了完整的CRUD功能(创建、读取、更新、删除),并支持数据导出和多表管理。
系统架构设计
1. 核心类结构
系统主要由两个核心类构成:
DatabaseManagerTemplate类 - 主窗口类,继承自QMainWindow
- 负责UI界面构建和用户交互
- 实现双表格视图(左侧表列表+右侧数据详情)
- 处理数据导出、删除等操作
Model/Record类 - 数据模型层
- 封装数据库基本操作(CRUD)
- 提供统一的数据库访问接口
- 支持事务处理和连接管理
2. 界面布局特点
系统采用典型的双表格布局:
左侧表格:
- 显示数据库中的所有表名
- 支持复选框多选和双击加载
- 表头包含"选择"和"打点记录表"两列
右侧表格:
- 显示选中表的详细记录
- 包含"选择"、"序号"、"时间"、"备注"
- 支持行选择和单元格编辑
基础模板类结构
class DatabaseManagerTemplate(QMainWindow):
def __init__(self, db_path, parent=None):
super().__init__(parent)
self.db_path = db_path
self.column_ratios = [] # 列宽比例配置
self.selected_rows = [] # 选中行记录
self.current_table = "" # 当前操作表名
def init_ui(self):
"""初始化UI组件"""
self.setup_table_views()
self.setup_buttons()
self.load_table_list()
def setup_table_views(self):
"""配置表格视图"""
self.setup_left_table() # 左侧表列表
self.setup_right_table() # 右侧数据详情
def setup_buttons(self):
"""配置功能按钮"""
self.setup_crud_buttons() # CRUD操作按钮
self.setup_export_buttons() # 导出功能按钮
核心功能模板方法
1. 数据库连接管理
系统通过SQLite3连接数据库,实现了稳健的连接管理:
class BaseModel:
"""数据库基础操作模板"""
def __init__(self, db_path):
self.db_path = db_path
self.conn = None
self.cursor = None
def connect(self):
"""连接数据库模板方法"""
self.conn = sqlite3.connect(self.db_path)
self.cursor = self.conn.cursor()
def close(self):
"""关闭连接模板方法"""
if self.cursor: self.cursor.close()
if self.conn: self.conn.close()
def execute_query(self, sql, params=None):
"""执行查询模板方法"""
self.connect()
self.cursor.execute(sql, params or ())
result = self.cursor.fetchall()
self.close()
return result
2. CRUD操作模板
系统抽象出通用的数据库操作方法:
def generic_insert(self, table, fields, values):
"""通用插入模板"""
placeholders = ', '.join('?' for _ in values)
sql = f"INSERT INTO {table} ({', '.join(fields)}) VALUES ({placeholders})"
self.execute_update(sql, values)
def generic_update(self, table, set_fields, where_condition, params):
"""通用更新模板"""
set_clause = ', '.join(f"{field} = ?" for field in set_fields)
sql = f"UPDATE {table} SET {set_clause} WHERE {where_condition}"
self.execute_update(sql, params)
def generic_delete(self, table, condition, params):
"""通用删除模板"""
sql = f"DELETE FROM {table} WHERE {condition}"
self.execute_update(sql, params)
3. 表格视图模板
def setup_table_template(self, table_view, headers, data, checkable=True):
"""表格视图通用模板"""
model = QStandardItemModel()
model.setHorizontalHeaderLabels(headers)
for row_idx, row_data in enumerate(data):
# 添加复选框列
if checkable:
item = QStandardItem()
item.setCheckable(True)
model.setItem(row_idx, 0, item)
# 添加数据列
for col_idx, cell_data in enumerate(row_data):
item = QStandardItem(str(cell_data))
model.setItem(row_idx, col_idx+1 if checkable else col_idx, item)
table_view.setModel(model)
self.adjust_column_widths(table_view)
4.数据导出功能
系统支持灵活的导出选项:
单表导出:
- 支持CSV格式
- 自定义保存路径
- 保留原始数据结构
多表批量导出:
- 导出为Excel多sheet文件
- 自动使用数据库文件名作为输出文件名
- 统一字段名称标准化
def ex_all_file(self):
save_path = QFileDialog.getExistingDirectory()
if save_path:
conn = sqlite3.connect(self.db_path)
tables_names = self.get_dot_record_names()
filename = os.path.splitext(self.db_path.split("/")[-1])[0]
csv_file_path = f'{save_path}/{filename}output.xlsx'
writer = pd.ExcelWriter(csv_file_path, engine='xlsxwriter')
for table_name in tables_names:
if table_name[0] != 'sqlite_sequence':
df = pd.read_sql_query(f"SELECT * FROM {table_name[0]}", conn)
df.columns = ["序号", "时间", "备注"]
df.to_excel(writer, sheet_name=table_name[0], index=False)
writer.save()
writer.close()
-
PyQt信号槽机制:合理使用信号槽连接可以实现松耦合的组件交互,如表格选择变化触发详情加载。
-
SQLite最佳实践:通过事务处理保证数据一致性,参数化查询防止SQL注入,资源自动释放(连接关闭)。
-
UI响应式设计:通过重写resizeEvent实现窗口大小变化时的自适应布局,提升用户体验。
-
MVC架构优势:分离数据模型(Model)和视图(View),通过控制器(Controller)协调交互,提高代码可维护性。
1万+

被折叠的 条评论
为什么被折叠?



