數據庫建表 + 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())