目录
一、背景介绍
二、封装数据库访问函数
(1)封装数据库连接函数dbconnect
(2)封装SQL查询函数SQLQuery
(3)封装SQL命令函数SQLCommand
三、主函数调用
1.定义主函数main()? ??
(1)插入数据
(2)修改数据
(3)删除数据
(4)查询数据.
(5)输出数据
2.执行主函数
四、通过Pandas保存为CSV文件
五、图形显示查询结果
六、程序代码
七、运行结果
一、背景介绍
? ? ? ?在项目开发中,经常要对常用的功能进行封装,本示例介绍python函数的封装过程,实现对数据库表的增、删、改、查等功能;通过Pandas的dataframe组件实现查询结果保存为CSV文件,以方便后期数据分析使用;借助图形化方法,图形显示查询的结果。mySQL数据库studb结构:
? ? ? ?请参照:Python查询MySQL数据库_强heaven的博客-CSDN博客
二、封装数据库访问函数
(1)封装数据库连接函数dbconnect
Python数据库连接函数使用pymysql.connect方法实现。如下实例:
#数据库连接 def dbConnect(): ? ? db = pymysql.connect(host='localhost', ? ? ? ? ? ? ? ? ? ? ?user='root', ? ? ? ? ? ? ? ? ? ? ?password='1234abcd!', ? ? ? ? ? ? ? ? ? ? ?database='studb', ? ? ? ? ? ? ? ? ? ? ?charset='utf8mb4',#mysql字符格式 ? ? ? ? ? ? ? ? ? ? ?cursorclass=pymysql.cursors.DictCursor) ? ? return db;
做如下封装:
#定义数据库连接函数
def dbConnect(hostname,username,password,database):
db = pymysql.connect(host=hostname,user=username,
password=password,database=database,
charset='utf8mb4',#mysql字符格式
cursorclass=pymysql.cursors.DictCursor)
return db;
(2)封装SQL查询函数SQLQuery
#定义SQL查询函数
def SQLQuery(db,strsql):
try:
cursor = db.cursor();
cursor.execute(strsql);
results = cursor.fetchall();
return results;
except pymysql.Error as err:
print(err)
finally:
cursor.close()
db.close()
(3)封装SQL命令函数SQLCommand
#定义SQL命令函数(create、insert、delete、update)
def SQLCommand(db,strsql):
try:
cursor = db.cursor();
cursor.execute(strsql);
#事务提交
db.commit()
return True;
except pymysql.Error as err:
print(err)
finally:
cursor.close()
db.close()
三、主函数调用
1.定义主函数main()? ??
def main():
hostname='127.0.0.1';#mySQL服务器地址
username='zcq';
password='1234abcd!';
database='studb';
(1)插入数据
#1.插入数据
db = dbConnect(hostname,username,password,database);#连接数据库
strsql = """insert into studb.t_student(T_Student_No,T_Student_Name,T_Student_Age,T_Student_Dep)
values('96055149','朱莉18',18,'科技大学')"""
ifok = SQLCommand(db,strsql);
if ifok:
print("插入成功!\n")
(2)修改数据
#2.构造更新语句
db = dbConnect(hostname,username,password,database);#连接数据库
strsql = """update studb.t_student set T_Student_Age=21
where T_Student_Name='张三3'"""
ifok = SQLCommand(db,strsql);
if ifok:
print("修改成功!\n")
(3)删除数据
#3.删除数据
db = dbConnect(hostname,username,password,database);#连接数据库
strsql = """delete from studb.t_student where T_Student_Name like'朱莉%'"""
ifok = SQLCommand(db,strsql);
if ifok:
print("删除成功!\n")
(4)查询数据.
#4.构造查询语句
db = dbConnect(hostname,username,password,database);#连接数据库
strsql = """SELECT T_Student_No,T_Student_Name,T_Student_Age,T_Student_Dep
FROM studb.t_student where T_Student_Age>=18 and T_Student_Age<=21"""
results = SQLQuery(db,strsql);
(5)输出数据
#5.输出显示
inum=0
print("学号,姓名,年龄,专业")
for row in results:
stu_No = row['T_Student_No']
stu_Name = row['T_Student_Name']
stu_Age = row['T_Student_Age']
stu_Dep = row['T_Student_Dep']
inum += 1
print("%s,%s,%s,%s"\
%(stu_No,stu_Name,stu_Age,stu_Dep))
print("\n代码执行完毕...查询到%d条符合条件记录。" %(inum))
2.执行主函数
main()
四、通过Pandas保存为CSV文件
#6.与Pandas对接,保存为CSV文件
df = pd.DataFrame(results);
df.to_csv('stu_query.csv',index=False)
print(df);
T_Student_Age T_Student_Dep T_Student_Name T_Student_No
0 18 发电1 张三1 1122101
1 19 发电2 张三2 1122102
2 21 发电3 张三3 1122103
3 18 发电4 张三4 1122104
4 19 发电5 张三5 1122105
5 20 发电6 张三6 1122106
6 18 发电7 张三7 1122107
7 19 发电8 张三8 1122108
8 20 发电9 张三9 1122109
9 20 科信部 朱四1 96055160
五、图形显示查询结果
#7.图形显示
test_A1 = df['T_Student_Age']
plt.figure()
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
plt.plot(list(range(len(test_A1))), test_A1, color='r')
plt.xlabel('满足条件的记录', fontsize=14)
plt.ylabel('年龄', fontsize=14)
plt.title('年龄分布曲线', fontsize=10)
plt.show()
六、程序代码
# -*- coding: utf-8 -*-
"""
Created on Sun Apr 3 14:39:15 2022
@author: zhuchunqiang
"""
import pandas as pd
import matplotlib.pyplot as plt
import pymysql
'''
#数据库连接
def dbConnect():
db = pymysql.connect(host='localhost',
user='root',
password='1234abcd!',
database='studb',
charset='utf8mb4',#mysql字符格式
cursorclass=pymysql.cursors.DictCursor)
return db;
'''
#定义数据库连接函数
def dbConnect(hostname,username,password,database):
db = pymysql.connect(host=hostname,user=username,
password=password,database=database,
charset='utf8mb4',#mysql字符格式
cursorclass=pymysql.cursors.DictCursor)
return db;
#定义SQL查询函数
def SQLQuery(db,strsql):
try:
cursor = db.cursor();
cursor.execute(strsql);
results = cursor.fetchall();
return results;
except pymysql.Error as err:
print(err)
finally:
cursor.close()
db.close()
#定义SQL命令函数(create、insert、delete、update)
def SQLCommand(db,strsql):
try:
cursor = db.cursor();
cursor.execute(strsql);
#事务提交
db.commit()
return True;
except pymysql.Error as err:
print(err)
finally:
cursor.close()
db.close()
#定义主函数
def main():
hostname='127.0.0.1';#mySQL服务器地址
username='zcq';
password='1234abcd!';
database='studb';
#1.插入数据
db = dbConnect(hostname,username,password,database);#连接数据库
strsql = """insert into studb.t_student(T_Student_No,T_Student_Name,T_Student_Age,T_Student_Dep)
values('96055149','朱莉18',18,'科技大学')"""
ifok = SQLCommand(db,strsql);
if ifok:
print("插入成功!\n")
#2.构造更新语句
db = dbConnect(hostname,username,password,database);#连接数据库
strsql = """update studb.t_student set T_Student_Age=21
where T_Student_Name='张三3'"""
ifok = SQLCommand(db,strsql);
if ifok:
print("修改成功!\n")
#3.删除数据
db = dbConnect(hostname,username,password,database);#连接数据库
strsql = """delete from studb.t_student where T_Student_Name like'朱莉%'"""
ifok = SQLCommand(db,strsql);
if ifok:
print("删除成功!\n")
#4.构造查询语句
db = dbConnect(hostname,username,password,database);#连接数据库
strsql = """SELECT T_Student_No,T_Student_Name,T_Student_Age,T_Student_Dep
FROM studb.t_student where T_Student_Age>=18 and T_Student_Age<=21"""
results = SQLQuery(db,strsql);
#5.输出显示
inum=0
print("学号,姓名,年龄,专业")
for row in results:
stu_No = row['T_Student_No']
stu_Name = row['T_Student_Name']
stu_Age = row['T_Student_Age']
stu_Dep = row['T_Student_Dep']
inum += 1
print("%s,%s,%s,%s"\
%(stu_No,stu_Name,stu_Age,stu_Dep))
print("\n代码执行完毕...查询到%d条符合条件记录。" %(inum))
#6.与Pandas对接,保存为CSV文件
df = pd.DataFrame(results);
df.to_csv('stu_query.csv',index=False)
print(df);
#7.图形显示
test_A1 = df['T_Student_Age']
plt.figure()
# 设置matplotlib正常显示中文和负号
plt.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
plt.plot(list(range(len(test_A1))), test_A1, color='r')
plt.xlabel('满足条件的记录', fontsize=14)
plt.ylabel('年龄', fontsize=14)
plt.title('年龄分布曲线', fontsize=10)
plt.show()
main()
七、运行结果
runfile('E:/PythonStudy/test/query_def.py', wdir='E:/PythonStudy/test')
插入成功!
修改成功!
删除成功!
学号,姓名,年龄,专业
1122101,张三1,18,发电1
1122102,张三2,19,发电2
1122103,张三3,21,发电3
1122104,张三4,18,发电4
1122105,张三5,19,发电5
1122106,张三6,20,发电6
1122107,张三7,18,发电7
1122108,张三8,19,发电8
1122109,张三9,20,发电9
96055160,朱四1,20,科信部
代码执行完毕...查询到10条符合条件记录。
T_Student_Age T_Student_Dep T_Student_Name T_Student_No
0 18 发电1 张三1 1122101
1 19 发电2 张三2 1122102
2 21 发电3 张三3 1122103
3 18 发电4 张三4 1122104
4 19 发电5 张三5 1122105
5 20 发电6 张三6 1122106
6 18 发电7 张三7 1122107
7 19 发电8 张三8 1122108
8 20 发电9 张三9 1122109
9 20 科信部 朱四1 96055160
|