PyQt5与SQLite数据库管理系统开发实践

项目概述

本文介绍一个基于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()
  1. PyQt信号槽机制‌:合理使用信号槽连接可以实现松耦合的组件交互,如表格选择变化触发详情加载。

  2. SQLite最佳实践‌:通过事务处理保证数据一致性,参数化查询防止SQL注入,资源自动释放(连接关闭)。

  3. UI响应式设计‌:通过重写resizeEvent实现窗口大小变化时的自适应布局,提升用户体验。

  4. MVC架构优势‌:分离数据模型(Model)和视图(View),通过控制器(Controller)协调交互,提高代码可维护性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值