python与数据库完整项⽬_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后,建议再装⼀个可视化⼯具,我⽤的Navicat for Mysql,感觉不错。界⾯见下图:
在这个⼯具界⾯下,可以很⽅便的创建修改数据表。有了⼯具后,接下来就是关键的填⼊数据。很多时候,客户或者我们⾃⼰的数据是放在excel⾥的,我们可以通过Navicat 的导⼊向导,很⽅便的将excel数据导⼊到数据库:
跟着向导,只需简单⼏步就可完成数据导⼊。
2.2、连接数据库
导⼊pymysql库,将库的连接等功能写⼊⾃建的类。本案通过读取.cfg配置⽂件(有关配置⽂件的知识,可参见python开发项⽬,不得不了解的.cfg配置⽂件),获得连接库需⽤到的5个参数,在_init_初始类属性时,建⽴连接,代码如下:
import pymysql
from configparser import ConfigParser
class MysqlDb():
self.cp = ConfigParser()
ad('source/sql_config.cfg')
host = ('sql_connect', 'host')
port = int(('sql_connect', 'port'))
user = ('sql_connect', 'user')
passwd = ('sql_connect', 'passwd')
db = ('sql_connect', 'db')
< = t(host=host,
port=port,
user=user,
passwd=passwd,
db=db)
self.cur = ursor(cursor=pymysql.cursors.DictCursor)
python入门教程视屏其中,sql_config.cfg⽂件内容为:
若不⽤配置⽂件,直接把5个参数写在程序⾥也可以,代码如下,貌似更简单:
class MysqlDb():
def __init__(self):
< = t(host=‘127.0.0.1’,
port=3306,
user=‘root’,
passwd=‘771222’,
db=‘1’)
self.cur = ursor(cursor=pymysql.cursors.DictCursor)
⼀、显⽰数据库内容
功能:在软件界⾯,点击左侧导航栏,到数据库中与展开项对应的表,将数据显⽰在中间表格⾥。若⽬标表不存在,提⽰创建。
实现步骤:
创建导航栏; → 点击导航栏,获取表名; → 查询数据库,到表,显⽰内容
具体过程:
1、⽤树形控件创建导航栏,数据来源为数据库
fetch you
数据库⾥导航栏数据源样式为:
⽤代码⼿动逐条输⼊是不可接受的,根据第⼀列数据长度特点,采⽤下⾯的批量创建⽅式,其中fl为传递的参数,意思是“路基”或者其他专业。
qd_lj = MysqlDb().select_db('SELECT * FROM 清单' + fl) # 通过⾃建的Mysqlbd类的select_db函数,
得到数据库⾥的⽬标表root = )
root.setText(0, fl)
root.setIcon(0, QIcon(r'source\3.png'))
for i in range(0, len(qd_lj)):
structural color什么意思bm = qd_lj[i]['编码']
mc = qd_lj[i]['名称']
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:
pass
self.item = root # ⾃定义设置初始选中根条⽬
2、设置点击树形控件条⽬的信号槽函数,将数据库表内容提取后显⽰在表格控件。
设置左键单击导航栏时,触发函数showtreesql()。具体获取数据功能在函数⾥设置。
def showtreesql(self, item): # 单击树形节点,将数据库内容显⽰在表⾥
self.inputtable.clearContents() #清空中间的表格控件
self.inputtable.setRowCount(0) # 初始表格控件
idea没有out文件夹
self.item = item # 单击导航栏时,信号槽⾃动带当前点击节点信息参数item
if not item.child(0): # 判断如果该节点没有⼦节点,即单击的为最底层节点,⾮⼦节点⽆对应表格self.decxcomb3.setDisabled(False)
self.select_item = "n" + (1).replace('-', '') # 根据该节点编码,得到对应表格名称
if self.decxcomb3.findText(self.select_item) == -1:
self.decxcomb3.addItem(self.select_item)
self.decxcomb3.setCurrentText(self.select_item) # 将表格名称显⽰在下拉框控件⾥
if self.table_exists(MysqlDb(),
self.select_item): # 查询数据库,判断是否存在对应的表,
self.inputtable.setRowCount(1)
self.sql_to_input(self.select_item, self.inputtable) #如果存在表,查询数据库,将数据读取到表格else:
# self.decxcomb3.isEnabled()
self.decxcomb3.setDisabled(True)
3、读取数据库内容到表格的功能函数代码:
def sql_to_input(self, sql_tabel, inputtable):
data = MysqlDb().select_db('SELECT * FROM ' + sql_tabel)
if data:
inputtable.setRowCount(len(data))
for i in range(len(data)):
inputtable.setItem(i, 0, QTableWidgetItem(data[i]['定额编号']))
inputtable.setItem(i, 1, QTableWidgetItem(data[i]['定额名称']))
inputtable.setItem(i, 2, QTableWidgetItem(data[i]['单位']))
inputtable.setItem(i, 3, QTableWidgetItem(data[i]['数量']))
# print('数据库写⼊已完成”')
else:
# print('源表为空表,不执⾏写⼊操作')
pass
判断数据库是否存在某表的函数块:
def table_exists(self, sql, table_name): # 这个函数⽤来判断数据库是否含某表tables = sql.select_db('SHOW TABLES') # 得到数据库⾥的所有表名,
tabels_list = []
for i in tables:
n = i['Tables_in_1']
tabels_list.append(n)
matlab要花钱吗>git bash怎么用if table_name in tabels_list:
return 1
else:
return 0
4、左键双击导航栏时,触发信号槽,当不存在⽬标表时,提⽰创建新表:
def edittreesql(self, item): # 双击树形节点,将新建数据库表
if not item.child(0): # 判断该节点没有⼦节点
self.select_item = "n" + (1).replace('-', '') # 记录该节点编码
self.decxcomb3.addItem(self.select_item)
self.decxcomb3.setCurrentText(self.select_item)
if self.table_exists(MysqlDb(), self.select_item): # 判断是否存在本节点为名的表# 判断结果存在,将内容显⽰在表格控件⾥
self.inputtable.clearContents()
self.sql_to_input(self.select_item, self.inputtable)
else:
if QMessageBox.information(self, "创建定额表",
"即将为本清单创建定额输⼊表:" + self.select_item,
QMessageBox.Yes | QMessageBox.No) == QMessageBox.Yes:
MysqlDb().biuldtabel(self.select_item) # 若没有则在数据库新建⼀个表,
self.inputtable.clearContents()
self.inputtable.setRowCount(1)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。