PyQt5 python 数据库 表格动态增删改详情
目录
- (一)、手动连接数据库
- (二)、编程中使用数据库
(一)、手动连接数据库
与下一个的程序连接数据库是独立的2个部分
(1)连接数据库
(2)设置数据源类型
(3)连接及测试
(4)属性中的连接字符串
(二)、编程中使用数据库
(5)在Form上加入datagridview,加入两个按钮
(6)代码中加上数据库相关命名空间
using System.Data.SqlClient;
(7)第一个按钮“连接数据库”中的代码
效果图:
from PyQt5.QtWidgets import * from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5 import QtCore from copy import copy import sys import pymysql ins="insert into student (Sno,Sname,Sage,Ssex,Stele) values ('{}','{}','{}','{}','{}');" delete="delete from student where Sno={}" sel="select * from student" upd="update student set Sname='{}',Sage='{}',Ssex='{}',Stele='{}' where Sno={};" def getCursor(): """ :return: 返回操作数据库的cursor """ conn = pymysql.connect(host='127.0.0.1' # 连接名称,默认127.0.0.1 , user='root' # 用户名 , passwd='' # 密码 http://www.cppcns.com , port=3306 # 端口,默认为3306 , db='mysql' # 数据库名称 , charset='utf8' # 字符编码 ) return conn def ExecuSQL(argv): """ 执行数据库的语句,但是没有返回值 :param argv: """ conn=getCursor() cur = conn.cursor() # 生成游标对象 cur.execute(argv) # 执行SQL语句 conn.commit() cur.close() # 关闭游标 conn.close() # 关闭连接 def getData(argv): """ 执行数据库的语句,有返回值 :param argv: """ conn = getCursor() cur = conn.cursor() # 生成游标对象 cur.execute(argv) # 执行SQL语句 data = cur.fetchall() # 通过fetchall方法获得数据 cur.close() # 关闭游标 conn.close() # 关闭连接 return data class Example(QWidget): def __init__(self, parent=None): super(Example, self).__init__(parent) hhbox = QHBoxLayout() # 横向布局 hhbowww.cppcns.comx_1=QHBoxLayout() vbox=QVBoxLayout() self.displayList = [] self.saveList = [] self.table = QTableWidget() self.addItem=QPushButton("添加数据") self.searchItem=QPushButton("刷新数据") self.deleteItem = QPushButton("删除数据") self.saveItem=QPushButton("保存数据") self.table_sitting() hhbox.addWidget(self.table) # 把表格加入布局 hhbox_1.addWidget(self.addItem) hhbox_1.addWidget(self.searchItem) hhbox_1.addWidget(self.deleteItem) hhbox_1.addWidget(self.saveItem) vbox.addLayout(hhbox) vbox.addLayout(hhbox_1) self.setLayout(vbox) # 创建布局 self.setWindowTitle("数据库—表格") self.setWindowIcon(QIcon("icon.png")) self.connecter() self.resize(680, 600) self.show() def connecter(self): self.addItem.clicked.connect(self._addItem) self.deleteItem.clicked.connect(self._deleteItem) self.searchItem.clicked.connect(self._redraw) self.saveItem.clicked.connect(self._saveItem) self.table.itemChanged.connect(self._dataChanged) def _dataChanged(self): """ 一旦检测到数据改变,则进行检查, 选择添加新数据还是对原数据进行修改 :return: """ row_select = self.table.selectedItems() if len(row_select) == 0: return row= row_select[0].row() content = (self.table.item(row, 0).text(), self.table.item(row, 1).text(), self.table.item(row, 2).text(), self.table.item(row, 3).text(), self.table.item(row, 4).text()) if row<=len(self.displayList): print("修改行",content) self.displayList[row-1]=content else: print("最新行",content) self.displayList.append(content) def _addItem(self): """ 添加空白行按钮的触发事件 添加后刷新视图 """ num = self.table.rowCount()-1 self.newLine(num) self.update() def init(self): """ 初始化操作 即从数据库加载数据 """ argvhttp://www.cppcns.com="select * from student" data=getData(argv) print("初始化") for index,item in enumerate(data): self.newLine(index+1,item=item) self.displayList.append(item) self.saveList=copy(self.displayList) self.update() def _redraw(self): """ repaint即刷新数据, 用保存的数据覆盖未保存的数据 """ self.table.setRowCount(0) self.table.clearContents() self.table_sitting(flag=0) for index,item in enumerate(self.saveList): self.newLine(index+1,item) self.update() def _deleteItem(self): """ 若有选中行,点击删除后即可删除 :return: """ # ExecuSQL() row_select = self.table.selectedItems() if len(row_select) == 0: return id = row_select[0].row() if int(id)<len(self.displayList): print("删除一条数据") self.displayList.pop(id-1) self.header.pop() self.table.removeRow(row_select[0].row()) self.update() def _saveItem(self): """ 点击保存需要 筛选出需要更新的数据 需要删除的数据 需要添加的数据 """ idList=[int(k[0]) for k in self.saveList] _idList=[int(k[0]) for k in self.displayList] print("点击保存") # print(self.saveList) # print(self.displayList) for item in self.displayList: if item not in self.saveList: print("存在修改数据") if item[0] not in idList: sql=ins.format(item[0],item[1], item[2], item[3], item[4]) print(sql) ExecuSQL(sql) print("insert") else: sql = upd.format(item[1], item[2], item[3], item[4],item[0]) print(sql) Exe编程客栈cuSQL(sql) print("update") for item in self.saveList: if item[0] not in _idList: sql = delete.format(item[0]) print(sql) ExecuSQL(sql) print("delete",item) self.saveList=copy(self.displayList) def newLine(self,num,item=None): """ :param num: 在对应序号处的序号画空白行 :param item: 输入为对应数据 """ # num=self.table.rowCount() self.table.insertRow(num) _0= QTableWidgetItem("") _0.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled) _1 = QTableWidgetItem("") _2 = QTableWidgetItem("") _3 = QTableWidgetItem("") _4 = QTableWidgetItem("") # item=studentInfo() if item !=None: _0.setText(str(item[0])) _1.setText(str(item[1])) _2.setText(str(item[2])) _3.setText(str(item[3])) _4.setText(str(item[4])) else: _0.setText(str(num)) self.table.setItem(num, 0, _0) self.table.setItem(num, 1, _1) self.table.setItwww.cppcns.comem(num, 2, _2) self.table.setItem(num, 3, _3) self.table.setItem(num, 4, _4) self.header.append(str(num)) self.table.setVerticalHeaderLabels(self.header) self.update() def table_sitting(self,flag=1): """ :param flag: 初始化表头和行列数 """ self.header = [""] self.table.setColumnCount(5) self.table.setRowCount(2) # 设置表格有两行五列 self.table.setItem(0, 0, QTableWidgetItem(" 学号")) self.table.setItem(0, 1, QTableWidgetItem("名字")) self.table.setItem(0, 2, QTableWidgetItem("出生日期")) self.table.setItem(0, 3, QTableWidgetItem("性别")) self.table.setItem(0, 4, QTableWidgetItem("电话号码")) if flag: self.init() if __name__ == "__main__": app = QApplication(sys.argv) dlg = Example() sys.exit(app.exec_()) ++
到此这篇关于PyQt5 python 数据库 表格动态增删改详情的文章就介绍到这了,更多相关PyQt5 python 数据库 表格动态增删改内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
精彩评论