一、概述
本项目旨在开发一个基于 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())
四、使用说明
- 运行程序后,会自动连接到 SQL Server 数据库,并显示数据库中的所有表名。
- 用户可以在输入框中输入自定义的 SQL 查询语句,或者直接选择一个表名。
- 点击查询按钮,程序将执行相应的查询操作,并将结果显示在表格中。
- 在
QListWidget
和QTableWidget
中,选中项的整行背景颜色将变为蓝色,文字颜色变为白色。
五、总结
通过本项目的开发,我们实现了一个简单易用的 SQL Server 数据库查询工具,同时对界面进行了优化,提升了用户体验。该工具可以作为一个基础框架,进一步扩展功能,如添加更多的数据库操作、优化查询结果显示等。