pyqt SQL Server 数据库查询-优化2

1、增加导出数据功能
2、增加删除表里数据功能
在这里插入图片描述

import sys
import pyodbc
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QLineEdit, QPushButton, \QTableWidget, QTableWidgetItem, QLabel, QMessageBox
from PyQt6.QtGui import QFont
from PyQt6.QtCore import Qt
import pandas as pd
from datetime import datetimeclass DatabaseQueryApp(QWidget):def __init__(self):super().__init__()self.initUI()self.connect_to_database()def initUI(self):# 设置窗口字体font = QFont()font.setPointSize(18)self.setFont(font)# 创建布局main_layout = QVBoxLayout()# 表列表、字段列表和输入框布局list_input_layout = QHBoxLayout()# 表列表部分table_label = QLabel("表:")list_input_layout.addWidget(table_label)self.table_list = QListWidget()# 调整显示表的控件大小self.table_list.setFixedHeight(100)# 设置 QListWidget 选中项整行变蓝色self.table_list.setStyleSheet("QListWidget::item:selected { background-color: blue; color: white; }")self.table_list.itemClicked.connect(self.show_table_columns)list_input_layout.addWidget(self.table_list)# 字段列表部分column_label = QLabel("字段:")list_input_layout.addWidget(column_label)self.column_list = QListWidget()self.column_list.setFixedHeight(100)self.column_list.setStyleSheet("QListWidget::item:selected { background-color: blue; color: white; }")list_input_layout.addWidget(self.column_list)# 查询输入部分value_label = QLabel("查询值:")list_input_layout.addWidget(value_label)self.value_input = QLineEdit()self.query_button = QPushButton('查询')# 获取当前按钮的大小current_width = self.query_button.sizeHint().width()current_height = self.query_button.sizeHint().height()# 设置按钮大小为原来的两倍button_size = (current_width * 2, current_height * 2)self.query_button.setFixedSize(*button_size)self.query_button.clicked.connect(self.execute_query)list_input_layout.addWidget(self.value_input)list_input_layout.addWidget(self.query_button)# 导出按钮self.export_button = QPushButton('导出')self.export_button.setFixedSize(*button_size)self.export_button.clicked.connect(self.export_table)list_input_layout.addWidget(self.export_button)# 清空按钮self.clear_button = QPushButton('清空')self.clear_button.setFixedSize(*button_size)self.clear_button.clicked.connect(self.clear_table)list_input_layout.addWidget(self.clear_button)main_layout.addLayout(list_input_layout)# 自定义查询输入部分custom_query_layout = QHBoxLayout()custom_query_label = QLabel("自定义查询:")custom_query_layout.addWidget(custom_query_label)self.custom_query_input = QLineEdit()self.custom_execute_button = QPushButton('执行')self.custom_execute_button.setFixedSize(*button_size)self.custom_execute_button.clicked.connect(self.execute_custom_query)custom_query_layout.addWidget(self.custom_query_input)custom_query_layout.addWidget(self.custom_execute_button)main_layout.addLayout(custom_query_layout)# 查询结果表格部分result_label = QLabel("查询结果:")main_layout.addWidget(result_label)self.result_table = QTableWidget()self.result_table.setColumnCount(0)self.result_table.setRowCount(0)# 设置 QTableWidget 选择行为为整行选择self.result_table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows)# 设置 QTableWidget 选中行整行变蓝色self.result_table.setStyleSheet("QTableWidget::item:selected { background-color: blue; color: white; }")main_layout.addWidget(self.result_table)self.setLayout(main_layout)self.setWindowTitle('数据库查询工具')self.setGeometry(300, 300, 1200, 900)self.setStyleSheet("""QWidget {background-color: #f0f0f0;}QLabel {font-weight: bold;}QPushButton {background-color: #4CAF50;color: white;padding: 10px 20px;border: none;border-radius: 5px;}QPushButton:hover {background-color: #45a049;}QLineEdit {padding: 8px;border: 1px solid #ccc;border-radius: 5px;}""")self.show()def connect_to_database(self):try:# 使用指定的连接字符串connection_string = 'DRIVER={SQL Server};SERVER=LEGENDLI;DATABASE=testbase;UID=sa;PWD=1'self.conn = pyodbc.connect(connection_string)cursor = self.conn.cursor()cursor.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'")tables = cursor.fetchall()for table in tables:self.table_list.addItem(table[0])except Exception as e:self.show_error_message(f"数据库连接错误: {e}")def show_table_columns(self, item):table_name = item.text()try:cursor = self.conn.cursor()cursor.execute(f"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{table_name}'")columns = cursor.fetchall()self.column_list.clear()for column in columns:self.column_list.addItem(column[0])except Exception as e:self.show_error_message(f"获取字段信息错误: {e}")def execute_query(self):selected_table_items = self.table_list.selectedItems()selected_column_items = self.column_list.selectedItems()if not selected_table_items:self.show_error_message("请选择一个表。")returntable_name = selected_table_items[0].text()value = self.value_input.text()if not selected_column_items or not value:query = f"SELECT * FROM {table_name}"else:column_name = selected_column_items[0].text()query = f"SELECT * FROM {table_name} WHERE {column_name} = '{value}'"try:cursor = self.conn.cursor()cursor.execute(query)results = cursor.fetchall()headers = [description[0] for description in cursor.description]self.result_table.setColumnCount(len(headers))self.result_table.setRowCount(len(results))self.result_table.setHorizontalHeaderLabels(headers)for row_index, row_data in enumerate(results):for col_index, col_data in enumerate(row_data):item = QTableWidgetItem(str(col_data))self.result_table.setItem(row_index, col_index, item)except Exception as e:self.show_error_message(f"查询错误: {e}")def execute_custom_query(self):query = self.custom_query_input.text().strip().lower()# 检查是否包含危险指令if "drop" in query or "DROP" in query \or 'update' in query or 'UPDATE' in query \or 'delete' in query or 'DELETE' in query \or 'truncate' in query or 'TRUNCATE' in query:self.show_error_message("不允许执行删除表或删除数据库的指令。")returntry:cursor = self.conn.cursor()cursor.execute(query)results = cursor.fetchall()headers = [description[0] for description in cursor.description]self.result_table.setColumnCount(len(headers))self.result_table.setRowCount(len(results))self.result_table.setHorizontalHeaderLabels(headers)for row_index, row_data in enumerate(results):for col_index, col_data in enumerate(row_data):item = QTableWidgetItem(str(col_data))self.result_table.setItem(row_index, col_index, item)except Exception as e:self.show_error_message(f"查询错误: {e}")def export_table(self):selected_table_items = self.table_list.selectedItems()if not selected_table_items:self.show_error_message("请选择一个表。")returntable_name = selected_table_items[0].text()try:# 导出数据到 Excelquery = f"SELECT * FROM {table_name}"df = pd.read_sql(query, self.conn)now = datetime.now().strftime("%Y%m%d%H%M%S")file_name = f"{table_name}_{now}.xlsx"df.to_excel(file_name, index=False)self.show_success_message(f"数据已导出到 {file_name}。")except Exception as e:self.show_error_message(f"导出数据时出错: {e}")def clear_table(self):selected_table_items = self.table_list.selectedItems()if not selected_table_items:self.show_error_message("请选择一个表。")returntable_name = selected_table_items[0].text()reply = QMessageBox.question(self, '确认', f'是否真的要清空表 {table_name} 的数据?',QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,QMessageBox.StandardButton.No)if reply == QMessageBox.StandardButton.Yes:try:cursor = self.conn.cursor()cursor.execute(f"DELETE FROM {table_name}")self.conn.commit()self.show_success_message(f"表 {table_name} 的数据已清空。")except Exception as e:self.show_error_message(f"清空表数据时出错: {e}")def show_error_message(self, message):msg_box = QMessageBox()msg_box.setIcon(QMessageBox.Icon.Critical)msg_box.setText(message)msg_box.setWindowTitle("错误提示")msg_box.exec()def show_success_message(self, message):msg_box = QMessageBox()msg_box.setIcon(QMessageBox.Icon.Information)msg_box.setText(message)msg_box.setWindowTitle("成功提示")msg_box.exec()if __name__ == '__main__':app = QApplication(sys.argv)ex = DatabaseQueryApp()sys.exit(app.exec())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/76167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github 热点项目 ChartDB AI自动导表结构+迁移脚本,3分钟生成专业数据库关系图

ChartDB堪称数据库设计神器!亮点①:动动手指输入SQL,秒出结构图,表关系一目了然,团队评审时再也不用画图两小时。亮点②:AI智能转换超贴心,MySQL转PostgreSQL只需点个按钮,跨平台迁移…

地质科研智能革命:当大语言模型“扎根”地质现场、大语言模型本地化部署与AI智能体协同创新实践

在地质学迈向“深时数字地球”(Deep-time Digital Earth)的进程中,传统研究方法正面临海量异构数据(地质图件、遥感影像、地震波谱等)的解析挑战。大语言模型(LLM)与AI智能体的本地化部署技术&a…

DAPP实战篇:使用web3.js连接合约

说明 本系列内容目录:专栏:区块链入门到放弃查看目录 如果你还没有创建好项目请先查看:《DApp实战篇:先用前端起个项目》,如果你还不知道web3.js是什么请先查看:《DApp实战篇:前端技术栈一览》。 安装 点此查看web3.js官方文档 打开项目根目录,并唤起终端: 键入w…

源代码保密解决方案

背景分析 随着各行各业业务数据信息化发展,各类产品研发及设计等行业,都有关乎自身发展的核心数据,包括业务数据、源代码保密数据、机密文档、用户数据等敏感信息,这些信息数据有以下共性: — 属于核心机密资料&…

dolphinscheduler单机部署链接oracle

部署成功请给小编一个赞或者收藏激励小编 1、安装准备 JDK版本:1.8或者1.8oracle版本:19Coracle驱动版本:8 2、安装jdk 下载地址:https://www.oracle.com/java/technologies/downloads/#java8 下载后上传到/tmp目录下。 然后执行下面命…

2025-04-08 NO.4 Quest3 交互教程

文章目录 1 环境准备2 新手指引:Building Blocks2.1 创建 OVR 相机2.2 创建交互功能2.3 创建交互物体 3 老手开发:Interaction SDK3.1 创建交互功能3.2 创建交互物体 4 UI 交互4.1 3D 按钮4.2 Unity UI ​ 新版 Meta SDK(v74)优化…

关于Spring MVC中@RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践

以下是关于Spring MVC中RequestMapping注解的详细解析,涵盖其核心功能、属性、使用场景及最佳实践: 1. 基础概念 RequestMapping是Spring MVC的核心注解,用于将HTTP请求映射到控制器(Controller)的方法上。它支持类级…

Scala 异常处理

Scala 异常处理 引言 Scala 是一门多范式编程语言,它结合了面向对象和函数式编程的特性。在软件开发过程中,异常处理是保证程序稳定性和可靠性的重要环节。本文将深入探讨 Scala 中的异常处理机制,包括异常的抛出、捕获和处理策略。 异常概述 什么是异常? 在计算机编程…

PyTorch:解锁AI新时代的钥匙

(前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站)。 揭开PyTorch面纱 对于许多刚开始接触人工智能领域的朋友来说,PyTorch这个名字或许既熟悉又陌生。…

React-06React中refs属性(字符串refs,回调形式,React.createRef() )

1.React中refs属性 绑定到render输出的任何组件上&#xff0c;通过this.ref.绑定名直接操作DOM元素或获取子组件的实例。 2.绑定refs实例 2.1 字符串refs(已经过时参考官网API) 字符串(string)的ref存在一定的效率问题 <input refinput1 type"text" placehole…

五子棋游戏开发:静态资源的重要性与设计思路

以下是以CSDN博客的形式整理的关于五子棋游戏静态资源需求的文章&#xff0c;基于我们之前的讨论&#xff0c;内容结构清晰&#xff0c;适合开发者阅读和参考。我尽量保持技术性、实用性&#xff0c;同时加入一些吸引读者的亮点。 五子棋游戏开发&#xff1a;静态资源的重要性与…

c编译和c++编译有什么区别?

文章目录 c编译和c编译有什么区别多态函数重载虚函数表 vtable 输入输出同步类型检查模板和特化链接 C 标准库 C 能编译 C 的代码吗&#xff1f; c编译和c编译有什么区别 多态 函数重载 C 支持多个同名函数&#xff08;参数不同&#xff09;&#xff0c;这是编译期多态 编译…

无缝集成Docker与Maven:docker-maven-plugin实战指南

关于 docker-maven-plugin 的详细介绍和使用指南&#xff0c;帮助你在 Maven 项目中实现 Docker 镜像的自动化构建、推送和管理。 1. 插件的作用 docker-maven-plugin 是一个 Maven 插件&#xff0c;允许在 Maven 构建生命周期中直接集成 Docker 操作&#xff0c;例如&#xf…

智能仓储数字孪生Demo(Unity实现)

一、项目背景与行业痛点 医药流通行业仓储管理面临三大核心挑战&#xff1a; 合规性风险&#xff1a;GSP&#xff08;药品经营质量管理规范&#xff09;对温湿度、药品批次追溯的严苛要求&#xff0c;传统人工记录易出错效率瓶颈&#xff1a;库区布局复杂&#xff0c;人工巡检…

详解 Go 的常见环境变量及其在 zshrc 中的配置

Go 语言作为一门现代化的编程语言&#xff0c;其编译、构建和包管理等环节都依赖于一系列环境变量的配置。正确理解和设置这些环境变量&#xff0c;对于 Go 开发至关重要。本文将详细介绍 Go 的常见环境变量&#xff0c;并解释如何将其配置到 zshrc 文件中&#xff0c;以方便日…

【NLP 55、强化学习与NLP】

万事开头难&#xff0c;苦尽便是甜 —— 25.4.8 一、什么是强化学习 强化学习和有监督学习是机器学习中的两种不同的学习范式 强化学习&#xff1a;目标是让智能体通过与环境的交互&#xff0c;学习到一个最优策略以最大化长期累积奖励。 不告诉具体路线&#xff0c;首先去做…

Java 面试系列:Java 中的运算符和流程控制 + 面试题

算术运算符 Java 中的算术运算符&#xff0c;包括以下几种&#xff1a; 算术运算符名称举例加法123-减法2-11*乘法2*36/除法24/83%求余24%73自增1int i1;i--自减1int i1;i-- 我们本讲要重点讲的是 “” 和 “--”&#xff0c;其他的算术运算符相对比较简单直观&#xff0c;本讲…

硅谷甄选项目笔记

硅谷甄选运营平台 此次教学课程为硅谷甄选运营平台项目,包含运营平台项目模板从0到1开发&#xff0c;以及数据大屏幕、权限等业务。 此次教学课程涉及到技术栈包含***:vue3TypeScriptvue-routerpiniaelement-plusaxiosecharts***等技术栈。 一、vue3组件通信方式 通信仓库地…

zk基础—zk实现分布式功能

1.zk实现数据发布订阅 (1)发布订阅系统一般有推模式和拉模式 推模式&#xff1a;服务端主动将更新的数据发送给所有订阅的客户端。 拉模式&#xff1a;客户端主动发起请求来获取最新数据(定时轮询拉取)。 (2)zk采用了推拉相结合来实现发布订阅 首先客户端需要向服务端注册自己关…

大坑!GaussDB数据库批量插入数据变只读

大坑!GaussDB数据库批量插入数据变只读 GaussDB插入数据时变只读df和du为什么不一致GaussDB磁盘空间使用阈值GaussDB变只读怎么办正确删除表的姿势GaussDB插入数据时变只读 涉及的数据库版本为:GaussDB Kernel 505.1.0 build da28c417。 GuassDB TPCC灌数报错DML失败,数据…