【PyQt5】連接 mysql 查詢數據 並顯示在 tableWidget 表格

數據庫建表 + SQL 語句


在這裏插入圖片描述
建立一個數據庫:test

建立一張數據表:tab,SQL 語句如下:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for tab
-- ----------------------------
DROP TABLE IF EXISTS `tab`;
CREATE TABLE `tab` (
  `id` int(11) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tab
-- ----------------------------
INSERT INTO `tab` VALUES ('172101', '小明');
INSERT INTO `tab` VALUES ('172102', '小紅');
INSERT INTO `tab` VALUES ('172103', '小黃');
INSERT INTO `tab` VALUES ('172104', '小黑');
INSERT INTO `tab` VALUES ('172105', '小三');
INSERT INTO `tab` VALUES ('172106', '小白');

Qt designer 製作界面

Qt designer 基本使用可以參考:【PyQt5】使用 designer 開發 python GUI 界面

我們隨意做一個有 tableWidget 的界面保存爲 hello.ui 並轉爲 hello.py:(代碼下面有)
在這裏插入圖片描述
hello.ui 界面文件轉爲的 hello.py 代碼如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'hello.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(316, 372)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(11, 11, 301, 271))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(2)
        self.tableWidget.setRowCount(9)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(4, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(5, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(6, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(7, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setVerticalHeaderItem(8, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        item.setTextAlignment(QtCore.Qt.AlignCenter)
        self.tableWidget.setItem(0, 0, item)
        self.button_read = QtWidgets.QPushButton(self.centralwidget)
        self.button_read.setGeometry(QtCore.QRect(90, 300, 121, 41))
        self.button_read.setObjectName("button_read")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "tableDemo"))
        item = self.tableWidget.verticalHeaderItem(0)
        item.setText(_translate("MainWindow", "1"))
        item = self.tableWidget.verticalHeaderItem(1)
        item.setText(_translate("MainWindow", "2"))
        item = self.tableWidget.verticalHeaderItem(2)
        item.setText(_translate("MainWindow", "3"))
        item = self.tableWidget.verticalHeaderItem(3)
        item.setText(_translate("MainWindow", "4"))
        item = self.tableWidget.verticalHeaderItem(4)
        item.setText(_translate("MainWindow", "5"))
        item = self.tableWidget.verticalHeaderItem(5)
        item.setText(_translate("MainWindow", "6"))
        item = self.tableWidget.verticalHeaderItem(6)
        item.setText(_translate("MainWindow", "7"))
        item = self.tableWidget.verticalHeaderItem(7)
        item.setText(_translate("MainWindow", "8"))
        item = self.tableWidget.verticalHeaderItem(8)
        item.setText(_translate("MainWindow", "9"))
        item = self.tableWidget.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "ID"))
        item = self.tableWidget.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "姓名"))
        __sortingEnabled = self.tableWidget.isSortingEnabled()
        self.tableWidget.setSortingEnabled(False)
        self.tableWidget.setSortingEnabled(__sortingEnabled)
        self.button_read.setText(_translate("MainWindow", "讀取"))

連接 MySQL 相關知識

Python 連接 MySQL 請看這個:【Python】PyMySQL 連接 MySQL數據庫

查詢並獲取數據庫的數據

由於我們界面與邏輯分離,界面代碼前面已經有了,現在要寫邏輯代碼;
新建一個 main.py,然後寫入下面代碼,即可在 tableWidget 中展示數據庫中的數據。

主要了解以下幾個知識點:

  • 連接 mysql 並 查詢數據庫,cur.fetchall() 返回的是二維元組
#數據庫連接對象
conn = pymysql.connect(host='localhost', port=3306, user='root', password="1234", db="test")
# 遊標對象
cur = conn.cursor()
# 查詢的sql語句
sql = "SELECT * FROM tab"
cur.execute(sql)
# 獲取查詢到的數據, 是以二維元組的形式存儲的, 所以讀取需要使用 data[i][j] 下標定位
data = cur.fetchall()
# 打印測試
print(data)
# print(data[0][1]) # 打印第1行第2個數據, 也就是小明
  • 遍歷二維元組並將數據顯示到表格上:
# 遍歷二維元組, 將 id 和 name 顯示到界面表格上
x = 0
for i in data:
    y = 0
    for j in i:
        self.tableWidget.setItem(x, y, QtWidgets.QTableWidgetItem(str(data[x][y])))
        y = y + 1
    x = x + 1

完整代碼:

import sys
from PyQt5 import QtGui, QtWidgets
from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication, QMainWindow, QHeaderView

from hello import Ui_MainWindow

import pymysql

class MyMainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MyMainWindow, self).__init__()
        self.setupUi(self)
        # 【讀取】功能
        self.button_read.clicked.connect(self.read)

    # 【讀取】按鈕功能
    def read(self):
        # 數據庫連接對象
        conn = pymysql.connect(host='localhost', port=3306, user='root', password="1234", db="test")
        # 遊標對象
        cur = conn.cursor()
        
        # 查詢的sql語句
        sql = "SELECT * FROM tab"
        cur.execute(sql)
        # 獲取查詢到的數據, 是以二維元組的形式存儲的, 所以讀取需要使用 data[i][j] 下標定位
        data = cur.fetchall()
        # 打印測試
        print(data)
        # print(data[0][1]) # 打印第1行第2個數據, 也就是小明

        # 遍歷二維元組, 將 id 和 name 顯示到界面表格上
        x = 0
        for i in data:
            y = 0
            for j in i:
                self.tableWidget.setItem(x, y, QtWidgets.QTableWidgetItem(str(data[x][y])))
                y = y + 1
            x = x + 1

        cur.close()
        conn.close()

if __name__ == "__main__":
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    app = QApplication(sys.argv)
    win = MyMainWindow()
    win.show()
    sys.exit(app.exec())

運行效果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章