当前位置: 首页 > 后端技术 > Python

实例分析:python操作数据库项目

时间:2023-03-26 16:52:26 Python

本文根据一个项目实例,记录分享python提取数据库内容显示到程序界面的过程及相关设置,探讨python操作数据库的用法数据库。主要分享内容:1.展示数据库内容。2.修改数据库内容。3.表格控件指定滑块的位置。4.自定义右键菜单。使用环境:python3.7+Mysql5+PyQt5针对人群:初学者或者需要查资料的,前辈勿喷,请多提宝贵意见,本人虚心接受。前期准备1.创建软件界面上图为使用PyQt5相关模块创建的项目造价系统界面。使用的模块和函数:1.QMainWindow模块:绘制整体框架,包括菜单、工具栏、状态栏。2、QTreeWidget模块:绘制左侧导航栏。3、QTableWidgetItem模块:绘制显示数据的中间表格。4、QComboBox、QPushButton模块:绘制下拉框和按钮控件。5、QSplitter模块:设置各种控件的放置组合,拖动鼠标调整窗口大小。6、QMessageBox模块:设置交互弹框。具体的界面绘制过程不是本文的重点,不再详述。2.与数据库建立连接要与数据库建立连接,首先要有一个具体的数据库。这种情况下,在本机上使用mysql建立自己的数据库,然后与软件工程进行连接。2.1.自建数据库下载安装Mysql后,建议安装一个可视化工具。我用的是NavicatforMysql,感觉不错。界面如下图所示:在该工具界面中,您可以方便地创建和修改数据表。有了工具,接下来就是填写关键数据了。很多时候,客户或者我们自己的数据都是放在excel里面的,我们可以通过Navicat的导入向导轻松的将excel数据导入到数据库中:按照向导操作,简单几步就可以完成数据的导入。2.2.连接数据库导入pymysql库,将库连接等函数写到自建类中。本例通过读取.cfg配置文件(关于配置文件的知识请参考python开发项目,你必须了解.cfg配置文件),获取连接库需要的5个参数,在_init_初始类属性,建立连接,代码如下:cfg')host=self.cp.get('sql_connect','host')port=int(self.cp.get('sql_connect','port'))user=self.cp.get('sql_connect','用户')passwd=self.cp。get('sql_connect','passwd')db=self.cp.get('sql_connect','db')self.conn=pymysql.connect(host=host,port=port,user=user,passwd=passwd,db=db)self.cur=self.conn.cursor(cursor=pymysql.cursors.DictCursor)其中,sql_config.cfg文件的内容是:如果不用配置文件,直接写程序中有5个参数,代码如下,看起来比较简单:classMysqlDb():def__init__(self):self.conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='771222',db='1')self.cur=self.conn.cursor(cursor=pymysql.cursors.DictCursor)显示数据库内容函数:在软件界面,点击左侧导航栏,在数据库中找到展开项对应的表,在中间表中显示数据。如果目标表不存在,会提示创建。实现步骤:创建导航栏;→点击导航栏获取表名;→查询数据库,找到表,显示内容具体过程:1.创建一个带树形控件的导航栏,数据源为数据库。数据库中导航栏的数据源样式为:用代码手工逐项输入是不能接受的。根据第一列数据长度的特点,采用如下批量创建方式,其中fl为传入的参数,表示“路基”或其他专业。defset_tree(self,fl):qd_lj=MysqlDb().select_db('SELECT*FROMlist'+fl)#通过自建Mysqlbd类的select_db函数获取数据库中的目标表root=QTreeWidgetItem(self.树)root.setText(0,fl)root.setIcon(0,QIcon(r'source\3.png'))foriinrange(0,len(qd_lj)):bm=qd_lj[i]['code']mc=qd_lj[i]['name']if(len(bm)==4):root1=QTreeWidgetItem(root)root1.setText(0,mc)root1.setText(1,bm)elif(len(bm)==7):root2=QTreeWidgetItem(root1)root2.setText(0,mc)root2.setText(1,bm)elif(len(bm)==10):root3=QTreeWidgetItem(root2)root3.setText(0,mc)root3.setText(1,bm)elif(len(bm)==13):root4=QTreeWidgetItem(root3)root4.setText(0,mc)root4.setText(1,bm)elif(len(bm)==16):root5=QTreeWidgetItem(root4)root5.setText(0,mc)root5.setText(1,bm)elif(len(bm)==19):root6=QTreeWidgetItem(root5)root6.setText(0,mc)root6.setText(1,bm)elif(len(bm)==22):root7=QTreeWidgetItem(root6)root7.setText(0,mc)root7.setText(1,bm)else:passself.tree.expandAll()#设置所有树组件展开self.item=root#自定义初始选择根项2.设置点击树控件项的信号槽函数,提取数据库表内容并显示它在桌子上控制自我。tree.itemClicked.connect(self.showtreesql)在左键单击导航栏时触发函数showtreesql()。具体的数据采集功能在函数中设置。defshowtreesql(self,item):#点击树节点显示表中的数据库内容self.inputtable.clearContents()#清空中间表控件self.inputtable.setRowCount(0)#初始表控件self.item=item#当导航栏被点击时,信号槽自动携带当前点击节点item的信息参数ifnotitem.child(0):#判断节点是否没有子节点,即被点击的节点是底层节点,非子节点没有对应表self.decxcomb3.setDisabled(False)self.select_item="n"+item.text(1).replace('-','')#根据节点代码,得到对应的表名ifself.decxcomb3.findText(self.select_item)==-1:self.decxcomb3.addItem(self.select_item)self.decxcomb3.setCurrentText(self.select_item)#显示表名在下拉框控件ifself.table_exists(MysqlDb(),self.select_item):#查询数据库判断是否有对应的table,self.inputtable.setRowCount(1)self.sql_to_input(self.select_item,self.inputtable)#如果有表,查询数据库,读取数据到表中else:#self.decxcomb3.isEnabled()self.decxcomb3.setDisabled(True)3.读取从数据库内容到表的函数代码:defsql_to_input(self,sql_tabel,inputtable):data=MysqlDb().select_db('SELECT*FROM'+sql_tabel)ifdata:inputtable.setRowCount(len(data))foriinrange(len(data)):inputtable.setItem(i,0,QTableWidgetItem(data[i]['quotanumber']))inputtable.setItem(i,1,QTableWidgetItem(data[i]['quotaname']))inputtable.setItem(i,2,QTableWidgetItem(data[i]['unit']))inputtable.setItem(i,3,QTableWidgetItem(data[i]['quantity']))#print('databasewriteTheinputhasbeencomplete"')else:#print('源表为空表,未进行写操作')pass函数块判断数据库中是否存在某张表:deftable_exists(self,sql,table_name):#这个函数用来判断数据库中是否包含某个表tables=sql.select_db('SHOWTABLES')#获取数据库中所有的表名,tabels_list=[]foriintables:n=i['Tables_in_1']tabels_list.append(n)如果表_nameintabels_list:return1else:return04.左键双击导航栏触发信号槽,当目标表不存在时,提示新建表:defedittreesql(self,item):#双击树节点,新建数据库表ifnotitem。child(0):#判断Node没有子节点self.select_item="n"+item.text(1).replace('-','')#记录节点代码self.decxcomb3.addItem(self.select_item)self.decxcomb3.setCurrentText(self.select_item)ifself.table_exists(MysqlDb(),self.select_item):#判断是否有名为该节点的表#判断结果存在,显示表控件中的内容self.inputtable.clearContents()self.sql_to_input(self.select_item,self.inputtable)else:ifQMessageBox.information(self,"Createaquotatable","Aquotainputtablewillbecreatedforthislist:"+self.select_item,QMessageBox.Yes|QMessageBox.No)==QMessageBox.Yes:MysqlDb().biuldtabel(self.select_item)#如果没有,则在数据库中新建一个表,self.inputtable.clearContents()self.inputtable.setRowCount(1)print('Createdtable:',self.select_item)修改数据库内容1.设置保存按钮self.saveinput=QPushButton('Savetodatabase')self.saveinput.clicked.connect(self.input_to_sql)2.写入保存按钮点击在函数块上definput_to_sql(self):ifself.decxcomb3.currentText():MysqlDb().execute_db('DELETEFROM'+self.decxcomb3.currentText())#写入数据库前清空原来的内容fori在范围内(self.inputtable.rowCount()):v=[]forjinrange(4):ifself.inputtable.item(i,j):v.append(self.inputtable.item(i,j).text())else:v.append('')insert_sql='INSERTINTO'+self.decxcomb3.currentText()+"(QuotaNumber,QuotaName,Unit,Quantity)VALUES('"+v[0]+"','"+v[1]+"','"+v[2]+"','"+v[3]+"')"MysqlDb().execute_db(insert_sql)表控件指定sliderposition设置下拉框选择item后,根据item名称,移动下方中间表格的上下滑块,显示当前nt项第一:设置信号槽:self.decxcomb2.currentTextChanged[str].connect(self.set_table2)设置功能块代码:defset_table2(self,fl):foriinrange(self.table2.rowCount()):ifself.table2.item(i,0).text()==fl:breakself.table2.verticalScrollBar().setValue(i)自定义右键菜单表格输入时,有时难免有插入或删除行的需求。最常见的是以下右键单击菜单句柄实现过程:1.设置表格控件响应右键self.inputtable.setContextMenuPolicy(Qt.CustomContextMenu)2.设置右键信号槽函数self.inputtable.customContextMenuRequested.connect(self.input_rightmenu)definput_rightmenu(self):#指定配额输入Table控件右键菜单try:self.contextMenu=QMenu()self.actionA=self.contextMenu.addAction(u'delete')self.actionB=self.contextMenu.addAction(u'insert')self.actionA.setIcon(QIcon(r"source\4.png"))self.contextMenu.popup(QCursor.pos())#菜单显示的位置self.actionA.triggered.connect(self.deletcurrrow)self.actionB.triggered.connect(self.insertcurrrow)self.contextMenu.show()exceptexceptase:print(e)3.功能块设置defdeletecurrow(self):self.inputtable.removeRow(self.inputtable.currentRow())#删除当前行definsertcurrrow(self):self.inputtable.insertRow(self.inputtable.currentRow())#Insert当前行一行文字来源网络,仅供学习,侵删。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,800+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕你学不会!https://shimo.im/docs/JWCghr8...《Python学习资料》关注公众号【蟒圈】,每日优质文章推送。