pyqt SQL Server 数据库查询

一、概述

本项目旨在开发一个基于 Python 和 PyQt6 的数据库查询工具,该工具能够连接到 SQL Server 数据库,显示数据库中的表名,支持用户输入 SQL 查询语句进行数据查询,并将查询结果展示在表格中。同时,为了提升用户体验,对界面进行了一系列优化,包括调整控件大小、设置选中项颜色、放大查询按钮以及改变查询输入区域背景颜色等。
在这里插入图片描述

二、功能实现

2.1 数据库连接

  • 连接字符串:使用固定的连接字符串 'DRIVER={SQL Server};SERVER=LEGENDLI;DATABASE=testbase;UID=sa;PWD=1' 连接到 SQL Server 数据库。
  • 查询表名:通过执行 SQL 语句 SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' 查询数据库中的所有表名,并将结果显示在 QListWidget 中。

2.2 界面布局

  • 主布局:采用 QVBoxLayout 作为主布局,从上到下依次排列表列表、查询输入区域和查询结果表格。
  • 表列表:使用 QListWidget 显示数据库中的表名,设置固定高度为 100 像素,并将选中项的背景颜色设置为蓝色,文字颜色设置为白色。
  • 查询输入区域:包含一个 QLineEdit 用于输入 SQL 查询语句,以及一个 QPushButton 用于触发查询操作。查询按钮的大小设置为原来的两倍,查询输入区域的背景颜色设置为黄色。
  • 查询结果表格:使用 QTableWidget 显示查询结果,设置选择行为为整行选择,并将选中行的背景颜色设置为蓝色,文字颜色设置为白色。

2.3 查询功能

  • 无输入查询:当用户点击查询按钮且输入框为空时,检查 QListWidget 中是否有选中的表名。如果有,则自动生成查询该表所有数据的 SQL 语句并执行。
  • 自定义查询:用户可以在输入框中输入自定义的 SQL 查询语句,点击查询按钮后执行该语句,并将结果显示在表格中。

三、代码实现

3.1 类和方法

  • DatabaseQueryApp:继承自 QWidget,是整个应用程序的主窗口类。
    • __init__ 方法:初始化界面和数据库连接。
    • initUI 方法:创建界面布局,设置控件属性和样式。
    • connect_to_database 方法:连接到 SQL Server 数据库,查询表名并显示在 QListWidget 中。
    • execute_query 方法:根据用户输入的查询语句或选中的表名执行查询操作,并将结果显示在表格中。

3.2 关键代码片段

# 设置 QListWidget 选中项整行变蓝色
self.table_list.setStyleSheet("QListWidget::item:selected { background-color: blue; color: white; }")

# 设置查询按钮大小为原来的两倍
current_width = self.query_button.sizeHint().width()
current_height = self.query_button.sizeHint().height()
self.query_button.setFixedSize(current_width * 2, current_height * 2)

# 设置查询输入区域背景颜色为黄色
query_input_container = QWidget()
query_input_container.setLayout(query_input_layout)
query_input_container.setStyleSheet("background-color: yellow;")

# 设置 QTableWidget 选中行整行变蓝色
self.result_table.setStyleSheet("QTableWidget::item:selected { background-color: blue; color: white; }")

全部代码

import sys
import pyodbc
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QLineEdit, QPushButton, \
    QTableWidget, QTableWidgetItem


class DatabaseQueryApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.connect_to_database()

    def initUI(self):
        # 创建布局
        main_layout = QVBoxLayout()

        # 表列表部分
        table_list_layout = QHBoxLayout()
        self.table_list = QListWidget()
        # 调整显示表的控件大小
        self.table_list.setFixedHeight(100)
        # 设置 QListWidget 选中项整行变蓝色
        self.table_list.setStyleSheet("QListWidget::item:selected { background-color: blue; color: white; }")
        table_list_layout.addWidget(self.table_list)

        # 查询输入部分
        query_input_layout = QHBoxLayout()
        self.query_input = QLineEdit()
        self.query_button = QPushButton('查询')
        # 获取当前按钮的大小
        current_width = self.query_button.sizeHint().width()
        current_height = self.query_button.sizeHint().height()
        # 设置按钮大小为原来的两倍
        self.query_button.setFixedSize(current_width * 2, current_height * 2)
        self.query_button.clicked.connect(self.execute_query)
        query_input_layout.addWidget(self.query_input)
        query_input_layout.addWidget(self.query_button)

        # 创建一个容器部件并设置布局
        query_input_container = QWidget()
        query_input_container.setLayout(query_input_layout)
        # 设置容器部件的背景颜色为黄色
        #query_input_container.setStyleSheet("background-color: yellow;")

        # 查询结果表格部分
        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.addLayout(table_list_layout)
        main_layout.addWidget(query_input_container)
        main_layout.addWidget(self.result_table)

        self.setLayout(main_layout)
        self.setWindowTitle('数据库查询工具')
        self.setGeometry(300, 300, 800, 600)
        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:
            print(f"数据库连接错误: {e}")

    def execute_query(self):
        query = self.query_input.text()
        if not query:
            # 若编辑框内无指令,获取选中的表名
            selected_items = self.table_list.selectedItems()
            if selected_items:
                table_name = selected_items[0].text()
                query = f"SELECT * FROM {table_name}"
            else:
                print("请选择一个表或输入查询指令。")
                return

        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:
            print(f"查询错误: {e}")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = DatabaseQueryApp()
    sys.exit(app.exec())

四、使用说明

  1. 运行程序后,会自动连接到 SQL Server 数据库,并显示数据库中的所有表名。
  2. 用户可以在输入框中输入自定义的 SQL 查询语句,或者直接选择一个表名。
  3. 点击查询按钮,程序将执行相应的查询操作,并将结果显示在表格中。
  4. QListWidgetQTableWidget 中,选中项的整行背景颜色将变为蓝色,文字颜色变为白色。

五、总结

通过本项目的开发,我们实现了一个简单易用的 SQL Server 数据库查询工具,同时对界面进行了优化,提升了用户体验。该工具可以作为一个基础框架,进一步扩展功能,如添加更多的数据库操作、优化查询结果显示等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值