暑期实习总结(焊点数据管理软件开发):Python操作MySQL数据库、Django搭建前端网页、以及Excel中数据与MySQL数据库的互转
这一周是我在企业实习的最后一周,在企业做的项目已基本完成。这篇博客的目的也是总结一些项目中的一些小问题,和相关功能的代码总结。
这个项目呢,由于企业的保密性,我并不能在此做一个完整的分享。但我可以做一些简单的介绍,记录我认为的一些技术要点。我在自己的简历中更新的该项目的介绍内容如下:
焊点数据管理软件开发:使用Python语言、MySQL数据库、Django框架开发了一个数据管理软件。使用Django搭建前端网页,使用Python语言处理大量焊点数据集并操作MySQL数据库,完成了智能车间质量二环中焊点数据从Excel到MySQL数据库的整合与存储,以及从MySQL数据库导出为Excel表数据的功能。
主要包含的关键点我认为有以下三个:Python操作数据库、Django搭建前端网页、以及Excel中数据与MySQL数据库的互转。
下面我将介绍一些相关功能样例代码:
连接数据库&使用Python操作数据库
在本项目中,我使用的是pymysql包来连接数据库的。个人感觉这个方法用起来非常方便。这个方法可以直接转译Mysql语言,这对于本身就有Mysql数据库的技术基础的友友来说非常方便。以下案例中,各位可以了解到我以上提到的点。
连接数据库:
def mysql_connection_A():# 打开数据库连接try:global dbdb = pymysql.connect(host='localhost', user='root', passwd='xxxxxx', port=3306)# passwd为用户安装mysql时设置的数据库密码print('连接成功!')except:print('something wrong!')# 使用 cursor() 方法创建一个游标对象 cursorglobal cursorcursor = db.cursor()sql = """use a_shift;"""# 这里直接转译mysql语句,将操作链接到a_shift这个数据库cursor.execute(sql)return cursor
该方法用途非常广泛,定义一个变量db来连接数据库,并通过创建一个游标对象来操作数据库。好处就是,用户在mysql中使用的所有sql语句都可以直接在python中完成。比如以上的“use a_shift”就是一段sql语句。
如果还不明白我的意思的话,下面给出一段代码,相信大家会有更深的了解:
sql1 = """DROP TABLE IF EXISTS {table_name}""".format(table_name=table_name)
cursor.execute(sql1)
sql2 = """create table {table_name}(id int primary key auto_increment, weld_num char(8), attr char(16))""".format(table_name=table_name)
cursor.execute(sql2)# 用于存取/提交数据到数据库的一个函数
def data_commit_sql(query1, values):# query:插入数据的sql语句;values:对应的数据库格式的值# 存取数据cursor.execute(query1, values)db.commit()data_commit_sql("INSERT INTO {table_name}(weld_num,attr) VALUES (%s, %s)".format(table_name=table_name), (weld_value, '厚度'))
首先可以看到sql1和sql2两个语句。两者都是sql语句,只不过其中的变量通过format方法给提取出来了。sql1语句的意思如果这个表存在的话,删除该表;sql2语句的意思就是创建一个指定格式的表。由此我们可以知道,通过这样的方法,我们完全能够用python结合简单的sql语句,直接操作数据库,而不需要在数据库中输入任何操作命令。并且其中的变量还能提取出来,从其他途径来获取。
然后就是data_commit_sql(query1, values)这个函数。这个函数实则就是一个游标获取语句和提交数据打包的一个函数。只是由于后面相同的操作太多,我才给他定义的这样一个函数。可以看到函数定义下面的一个例子,insert这个语句。这个语句意思就是在表中插入一些数据。而这个数据是通过values(%s,%s)链接出来的。例子中,第一个%s就对应的weld_value这个变量,第二个%s就对应的’厚度’这个字符串。
所以在pymysql方法的相关操作中,除了最基本的语言方法之外。我们可以通过format()方法和values(%s,)的方法来定义外部变量,从而完成用python操作mysql数据库的相关操作。
Django搭建前端网页
这个网页的搭建方法和教程啥的我这里就不用多说了。具体可以参考我之前的博客,或者去b站看教程:
Django学习记录:初步认识django以及实现了简单的网页登录页面的前后端开发_dumpling0120的博客-CSDN博客
Django学习记录:使用ORM操作MySQL数据库并完成数据的增删改查_dumpling0120的博客-CSDN博客
2022 B站最详细django3教程(django从入门到实践)_哔哩哔哩_bilibili
这里提几个功能简单介绍一下。
form表的使用:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h1>用户登录</h1>
<form method="post" action = "/login/">{% csrf_token %}<input type = "text" name = "user" placeholder="用户名"><input type = "password" name = "pwd" placeholder="密码"><input type = "submit" value="提交"><span style="color:red;"> {{ error_msg }}</span></form></body>
</html>
这个也是上面有一期博客中已经提到过的登录界面的代码。在这里我想讲的就是,form表的相关使用可以推广。三种类型“text”代表可视化字符,“password”代表不可见的字符(密码),“submit”就是一个提交的跳转按钮。然后使用的时候需要加上{% csrf_token %},不然会报错。
按钮跳转:
1、跳转到某网页:
// 设置按钮
<button οnclick="location.href='{% url 'A_shift' %}'">A班</button>
<button οnclick="location.href='{% url 'B_shift' %}'">B班</button>
注意这个url需要跳转的网页的地址是需要在urls.py这个文件中定义的:
path('pymysql_testA/', views.pymysql_testA, name='A_shift'),
path('pymysql_testB/', views.pymysql_testB, name='B_shift'),
2、点击按钮后实现某些操作:
<button id="showTablesButtonA">A班</button><script src={% static 'js/jquery-3.6.0.min.js' %}></script>
<script>$(document).ready(function() {$('#showTablesButtonA').click(function() {// 发起 Ajax 请求获取表数据$.ajax({url: '/get_tables_A/', // 表格的路由地址type: 'GET',data: {'is_button_pressed_A': 'true'},success: function(response) {// 在按钮下方显示表数据$('#tableData').html('<h3>A班数据表总览</h3>' + response);// 发送表存在状态到后端$('#is_A_table_generated').val('true'); // 设置隐藏字段的值$.ajax({url: '/database_to_excel/',type: 'POST',data: {'is_A_table_generated': $('#is_A_table_generated').val()},success: function(response) {// 处理成功响应}});}});});});
</script>
这段代码是引入jquery包后的一段JavaScript语言编写的一个按钮响应事件,实现的功能则是如下:
点击A班/B班按钮,则可以从数据库中提取并查看A班/B班数据库中的数据总列表,展示在网页中。具体代码示例就是上面的例子。其中上面有个这个:$(‘#is_A_table_generated’).val(‘true’); // 设置隐藏字段的值。这里是一个关键,是我作为后续模块中的一个参数的开关,这个隐藏字段在下面的代码起到了传值的作用。不知道我这么解释大家看得懂不hhh。
<h2>请选择您想导出的数据表和存储路径</h2>
<h4>*数据表名请从原数据库表中复制;存储路径格式举例:D:\PyCharm\file2.xls</h4>
<form method="post" action = "/database_to_excel/">{% csrf_token %}<input type="hidden" id="is_A_table_generated" name="is_A_table_generated" value=""><input type="hidden" id="is_B_table_generated" name="is_B_table_generated" value=""><input type = "text" name = "database_name" placeholder="数据表名"><input type = "text" name = "storage_path" placeholder="存储路径"><button type="submit">提交</button></form>
由于本人不太懂JavaScript,故这里不再多赘述。想了解这方面知识的友友可以自行查看相关资料,或私信与我交流。
Excel中数据与MySQL数据库的互转
从excel中将数据传入MySQL中,这个demo其实在第一个大点“连接数据库&使用Python操作数据库”有所涉及。不过我这里还是总结性的讲一下我的一个思路吧。
主要采用的还是下面几个包:
import pandas as pd
import xlwt
import xlrd
下面我就分别讲一下两者互传数据的思路。
从excel中提取数据并存入MySQL
pandas则是用来读取excel数据,然后xlwt和xlrd这两个包则是用来处理表中的值。以下举个简单例子:
excel_data = pd.read_excel(source_file_path_1)
# 提取检测后数据
detect_data = excel_data.iloc[0, 12]
# 提取好的产品数据
good_pro_data = excel_data.iloc[1, 12]
这就是简单的一个pandas读取这个路径下excel表中的值,并将表中相关数据提取出来。然后使用上文提到的data_commit_sql(query1, values)函数将这两个值传进数据库中即可。
从MySQL中提取数据表并存入Excel
由于提取的表格式是不需要改变的,所以这个点我写了一个完整的函数。
def export_to_excel(cursor, table, save_path):"""cursor: 源数据的数据库游标,用于数据库连接table 源数据的数据表,指定需要转换的数据库表save_path 文件保存路径,指定文件保存的位置和excel文档的名字"""# 创建保存数据库的excel表workbook = xlwt.Workbook()worksheet = workbook.add_sheet("sheet1")# 首先向excel表中写入数据表的字段column_count = cursor.execute("desc %s"%table)for i in range(column_count):temptuple = cursor.fetchone()worksheet.write(0, i, temptuple[0])# 向构建好字段的excel表写入所有的数据记录row_count = cursor.execute("select * from %s"%table)for i in range(row_count):temptuple = cursor.fetchone()for j in range(column_count):worksheet.write(i + 1, j, temptuple[j])# 指定路径并保存workbook.save(save_path)print('文件转换成功')# 应用举例
export_to_excel(cursorA, '{database_name}'.format(database_name=database_name), r"{storage_path}".format(storage_path=storage_path))
注释中也将相关方法说明得很详细了。在使用中调用该函数export_to_excel(cursor, table, save_path)的时候需要注意下相关格式就好。需要注意的是table表名和save_path的格式。table表名字的话建议format一下,然后路径也是建议加个r,防止路径格式报错。
总结
博主本科机械,研究生做控制。这次在车企实习呢,实习内容又是做数据处理以及相关的前后端开发。虽然看上去毫不沾边,但如果能用两个月的时间多学一个技术栈,想想也是极好的。毕竟有目的性地学习,我认为是可以大大提高我的学习效率。况且在这个信息化的时代,这样类似的数据管理系统,几乎每个企业都是有这样的需求并且能够用得上的。所以,我也是非常感谢这样的机会,让我能够了解企业,真实了解并参与企业的相关项目!
感谢你能看到最后,希望我能与大家多多交流技术,一起进步,一起成长!