前言
本文是我学MySQL后,做的一个小项目,因为初学,没有做的很高大上,代码方面也一般般,但是总归是自己做的,还是有点小小成就感的,在这里和大家分享下,喜欢的点个赞,一起冲冲冲。
这个项目主要是想锻炼下我个人的能力,加深对数据库的理解,所以文章可能会有点赘余(就是有点长的意思,哈哈哈),大家不要介意哈
我会从数据库的建立,到用python tkinter库做界面一一的进行简述。
建立数据库
建立数据库,我使用Navicat对MySQL进行管理,图形化界面操作真的很简单,但是为了能更好的加强自己对SQL语句的理解,我用SQL语句进行创建数据库及其相对应的表。
这里我们创建一个新的库并将其命名为play_music_test
create database play_music_test
因为我要做的是一个音乐播放器,每个用户都拥有自己的一个歌单(数据库),这就要求我们需要建立一个用户表,还有一个音乐表,同时还要有一个关系表,这样进行数据管理的时候才不会混乱
用户表:我们需要有个用户名还有登录密码,同时还要有一个id,id是为了让每个用户不会因为用户名重复,或者是其他方面造成歌单混乱,所以需要有有一个唯一的身份标识,也就是id是一个主键,同时为了方便还应该是一个自增的id
create table t_user(
id int primary key auto_increment,
uname varchar(20),
passwords varchar(20)
);
音乐表:需要有音乐名称和音乐路径,同时还要有一个独立id,毕竟用户那么多,肯定会有重复的音乐,所以唯一的id也是需要的,语法与用户表是一样的
create table t_music(
id int primary key auto_increment,
music_name varchar(255),
path varchar(255)
);
关系表:这是本次项目的关键点,靠着这个表,我们才能知道哪个用户有哪些歌曲,不至于出现混乱
所以这张表不但需要独立的id,还需要两个外键和用户表,音乐表建立连接
create table t_list(
id int primary key auto_increment,
mid int,
uid int,
constraint foreign key(mid) references t_music(id),
constraint foreign key(uid) references t_user(id)
);
我们建立好三个表后,可以用下面这个语句查看下已经创建的表
show tables;
同时还可以利用desc table_name查看表的基本结构,tabel_name是表名,desc是关键字
到这里我们就建立好我们的项目的基础了,接下来我们需要向数据库存入用户数据,先建立用户数据,是因为本次项目主要目的还是以熟悉MySQL为主,就直接点开始先建立好数据
insert t_user(uname,passwords)
values('zs',123),
('lisi',123);
通过**select * from t_user;**我们可以看到已经插入了两条用户数据,我们没有对id字段进行插入,但id却有值,这就是我们的主键约束和自增约束起的作用
DBUtil类
我们通过已经建立好的相应的表,接下来将是利用python对MySQL数据库建立交互,这样我们才能通过我们写的代码对数据库做出相应的操作,DBUtil是我封装的一个类主要是简化我们代码对数据库的操作。
我们需要在我们的python中导入PyMySQL库,PyMySQL是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中使用mysqldb。利用PyMySQL我们可以连接数据库,并实现简单的增删改查
在进行下面这一步时,需要保证已经安装了最新版的PyMySQL库,并且设置好了数据库,否则会连接失败。
# 获取连接
connection = pymysql.connect(host='localhost', user='root',password='root',db='play_music_test',charset='utf8')
# 创建cursor对象
cursor = connection.cursor()
connect()方法是pymysql提供与数据库建立连接的方法,具体的使用可以参考一位大牛的文章
https://blog.csdn.net/XC_SunnyBoy/article/details/108546128
这样我们就可以与数据库建立了连接了
建立连接后,我们用sql语言进行操作,并进行相应的提交事务(commit),回滚事务(rollback),开始事务(begin)。
如我们的插入数据,由于执行cursor.execute(sql)会打开一个事务,所以需要我们提交,数据库才能进行记录
music_name = '七元 - If'
pash = 'D:\music_file\cloud_music\七元 - If.mp3'
# 编写sql
sql = "insert into t_music(music_name,path) value(%s,%s)"
# 执行sql
count = cursor.execute(sql, music_name, pash)
# 执行DML时候,会开启一个事务,需要我们主动提交
connection.commit()
回滚事务则是我们操作错误了,但是事务已经开始了,我们必须得将刚才得错误撤回,这时候我们就可以回滚事务,如
try:
# 执行sql
count = self.cursor.execute(sql,args)
# 提交事务
self.connection.commit()
return count
except Exception as e:
print(e)
if self.connection:
self.connection.rollback()
finally:
self.close_file()
close_file()是我封装的一个方法,用来释放建立的游标资源
def close_file(self):
if self.cursor:
self.cursor.close()
if self.connection:
self.connection.close()
因为每次进行操作都要进行提交事务,关闭游标资源等操作,在我们的项目中需要对数据库进行大量的操作,所以这里就需要将这些方法封装进我们的DBUtl工厂类中。
那么接下来,我们需要做的就是创建我们的DBUtil类,并把连接方法,数据库操作的方法都放入这个类中,做一个工具类
直接贴代码
__init__方法中是我们的实例属性,将连接通道和游标对象都获取了,那接下来,便不用再一次次去写这些代码了
import pymysql
class DBUtil:
config={
'host': 'localhost',
'user': 'root',
'password': 'root',
'db': 'play_music_test',
'charset': 'utf8'}
def __init__(self):
self.connection = pymysql.connect(**DBUtil.config)
self.cursor = self.connection.cursor()
def close_file(self):
if self.cursor:
self.cursor.close()
if self.connection:
self.connection.close()
# 插入 修改 删除调用
def exeDML(self,sql,*args):
try:
# 执行sql
count = self.cursor.execute(sql,args)
# 提交事务
self.connection.commit()
return count
except Exception as e:
print(e)
if self.connection:
self.connection.rollback()
finally:
self.close_file()
# 单句查询
def query_one(self,sql,*args):
try:
# 执行sql
self.cursor.execute(sql,args)
# 获取结果集
return self.cursor.fetchone()
except Exception as e:
print(e)
finally:
self.close_file()
# 多句查询
def query_all(self,sql,*args):
try:
# 执行sql
self.cursor.execute(sql,args)
# 获取结果集
return self.cursor.fetchall()
except Exception as e:
print(e)
finally:
self.close_file()
为了编写,下面代码时不会太长,也便于日后修改调用,这里将DBUtil类单独做一个.py文件,当成一个库来调用
主程序的搭建
那接下来我们需要写我们的主程序,一步一步来搭建我们的音乐播放器。
首先我们需要知道我们的音乐播放器有什么功能
- 必须有不同用户,且每个用户都拥有自己的歌单,
- 音乐播放器要能导入音乐,这样用户才能选择自己喜欢的音乐导入,形成自己的歌单
- 删除功能,用户导错歌了,或者不喜欢某首歌了,那么就必须把歌曲从自己的歌单中删除
- 播放功能,身为音乐播放器,不能播放音乐,那还叫什么音乐播放器呀
大体就是以上四个功能,还有其他的一些功能可以加,但是项目周期也会越长,所以这里就先加这些了
注:我把不同的类封装在不同的.py文件中,一是方便修改,二是容易找出出错的地方,本次项目中我封装了三个类,分别是DBUtil(工具类), MyService(功能类),PlayWindow(界面类)
实现登录功能
实现第一要求,不同的用户要有不同的歌单,也就是在t_user表中的每个用户都可以进行登录,而不在t_user表中的用户,则无法操作,我们需要输入用户名和密码,然后去t_user表中查询
这里我偷一下懒,没有用GUI,编写登录界面,只是通过简单的input语句进行操作
uname = input('请输入用户名:')
password = input('请输入密码:')
获取完我们的用户名后,我们需要去到t_user表中对比下,这个用户是否存在,如果存在则进入我们的用户界面,也就是我们的音乐播放器
在MyService类中我们将用户登录的代码封装成一个类方法,如果用户存在,返回True,不存在,则返回False
# 用户登录
def login(self,uname,password):
sql = 'select * from t_user where uname=%s and password=%s'
self.user = DBUtil().query_one(sql,uname,password)
if self.user:
return True
else:
return False
得到用户是否存在的结果后,我们就可以进行相应的操作
# 判断用户是否存在
if myserbise.login(uname,password):
print('登录成功')
# 进入用户界面
playwindow.showWindow()
else:
print('登录失败')
这样第一个要求,我们基本实现了,接下来登录后,就该看到我们的用户界面了
用户界面
利用tkinter库,我们可以做一个简单的用户界面,首先是我们的三个剩下的三个功能,播放、导入、删除,那我们可以把他们封装成一个个按钮,那做完按钮后,我们还需要一个可以显示歌单的控件,这样用户才能查看自己的歌单进行相应的操作。
在PlayWindow类中
# 用户登录成功显示界面
def showWindow(self):
# 主窗口显示
top = tkinter.Tk()
top.title('音乐播放插件')
# 组件插入
self.createWidget(top)
# 将音乐名插入到label01上
self.insert_mname()
top.mainloop()
# 组件方法
def createWidget(self,top):
# 按扭设置
btn01 = tkinter.Button(top, text='播放音乐')
btn02 = tkinter.Button(top, text='导入音乐')
btn03 = tkinter.Button(top, text='删除音乐')
btn01.grid(row=0, column=0, padx=3)
btn02.grid(row=0, column=3, padx=3)
btn03.grid(row=0, column=6, padx=3)
# 音乐列表
self.label01 = tkinter.Listbox(top)
self.label01.grid(row=1, column=0, columnspan=10)
# 事件方法
btn01.bind('<Button-1>', self.play_music)
btn02.bind('<Button-1>', self.import_music)
btn03.bind('<Button-1>', self.del_music)
完成了用户登录界面后,我们需要给相对应的按钮添加对应得方法,如上面的代码,最后便是使用鼠标左键触发事件的
那我们可以先将这三个方法名写出,然后慢慢完善
导入音乐
导入音乐方法为什么最先写呢,因为用户刚开始登录的时候歌单肯定是空的,这时候我们要进行删除或者播放都是比较困难的,而且即使写出来了也无法进行调试,所以这里先写导入音乐方法。
导入音乐需要用到tkinter中的askopenfilenames方法(这个方法可以返回多个文件名列表)对文件进行操作,
为什么只导入文件名呢,因为,数据库是对数据进行管理的,而不是储存文件的地方,所以存入相对应的文件名和路径,可以找到文件,进行操作。
from tkinter.filedialog import askopenfilenames
PlayWindow导入音乐的方法是调用了功能类MyService中的方法
# 导入音乐
def import_music(self,event):
print('导入音乐')
music_file = askopenfilenames(title='导入的音乐',
initialdir='D:\music_file\cloud_music',
filetypes=[("音乐文件",".mp3")])
# 将音乐名及路径存入数据库
self.myserbise.add_music(music_file)
# 导入音乐后更新音乐列表
self.insert_mname()
在接收导入的文件名后,将其传入MyService类中的add_music()方法中
在add_music()方法中,我们需要对数据库进行相应的查询插入操作,首先我们需要对传回来的音乐名进行切边操作,提取出我们需要的信息
for f in files:
start = f.rfind('/')+1
end = f.rfind('.mp3')
music_name = f[start:end]
path = f
将传来的文件名分为音乐名和路径两,接下来我们是不是可以将音乐插入数据库了
sql = 'insert into t_music(music_name,path) values(%s,%s)'
DBUtil().exeDML(sql,music_name,path)
可是,直接插入,是不是有点不妥,我们要求音乐表里每首音乐都是唯一的,也就是不能有重复的音乐,所以我们插入前应该先检查音乐库中是不是已经有这首歌了
sql = "select * from t_music where music_name=%s"
music = DBUtil().query_one(sql,music_name)
是不是有了,我们不知道,但是可以肯定的是,如果音乐表中没有这首歌,我们是必须将这首歌插入音乐表中,同时这也表明,我们登录的用户,自己的歌单没有这首歌,所以我们需要将该用户添加了这首歌的记录,写入关系表中。
# 导入音乐库没有的音乐
print('音乐库里没有这首歌,写入开始')
sql = 'insert into t_music(music_name,path) values(%s,%s)'
DBUtil().exeDML(sql,music_name,path)
print('写入结束,开始写入关系表')
# 导入关系表,用户添加记录
music = self.music_id(music_name)
sql = 'insert into t_list(mid,uid) values(%s,%s)'
DBUtil().exeDML(sql, music[0], self.user[0])
print('结束')
不存在的情况比较好想点,存在的情况下,我们也需要进行判断,该用户是不是有这首歌了呢,如果他有的话,我们就没必要进行数据插入了,那如何知道呢,这时候就可以查询关系表,我们关系的mid和uid字段可是和音乐表和用户表的id有关联的
print('音乐库已经有这首歌啦')
sql = 'select * from t_list where mid=%s and uid=%s'
t_list = DBUtil().query_one(sql, music[0], self.user[0])
if not t_list:
print('该用户还没有这首歌')
sql = 'insert into t_list(mid,uid) values(%s,%s)'
DBUtil().exeDML(sql, music[0], self.user[0])
MyService类中完整的add_music方法
# 加入音乐
def add_music(self,files):
print(files)
for f in files:
start = f.rfind('/')+1
end = f.rfind('.mp3')
music_name = f[start:end]
path = f
sql = "select * from t_music where music_name=%s"
music = DBUtil().query_one(sql,music_name)
if music:
print('音乐库已经有这首歌啦')
sql = 'select * from t_list where mid=%s and uid=%s'
t_list = DBUtil().query_one(sql, music[0], self.user[0])
if not t_list:
print('该用户还没有这首歌')
sql = 'insert into t_list(mid,uid) values(%s,%s)'
DBUtil().exeDML(sql, music[0], self.user[0])
else:
# 导入音乐库没有的音乐
print('音乐库里没有这首歌,写入开始')
sql = 'insert into t_music(music_name,path) values(%s,%s)'
DBUtil().exeDML(sql,music_name,path)
print('写入结束,开始写入关系表')
# 导入关系表,用户添加记录
music = self.music_id(music_name)
sql = 'insert into t_list(mid,uid) values(%s,%s)'
DBUtil().exeDML(sql, music[0], self.user[0])
print('结束')
print('结束 ')
在进入下一步之前,我们先思考下,用户怎么知道自己的歌单有哪些歌呢?
肯定不是直接打开数据库查看,这时候我们可以用之前设置的Listbox组件,将音乐表中属于该用户的歌曲插入到Listbox组件上,那这时候就要用到我们的多表查询了
MyService类
# 扫描t_music,将音乐名全部导出
def find_mname(self):
sql = "select m.music_name from t_music m,t_list t where m.id=t.mid and t.uid=%s"
return DBUtil().query_all(sql,self.user[0])
PlayWindow类
# 插入音乐名至列表
def insert_mname(self):
self.label01.delete(0,tkinter.END)
music_name = self.myserbise.find_mname()
for mname in music_name:
self.label01.insert(tkinter.END, mname)
接下来我们只需要在合适的地方调用这些方法就可以了
删除音乐
前面将音乐插入到Listbox组件,这时候就可以发挥作用了,用户刚好想删除某些歌曲,那不是正好可以利用Listbox组件的功能,获取音乐名,然后用SQL进行删除
PlayWindow类中获取音乐名字,然后到MyService中进行操作
def del_music(self,event):
try:
print('删除音乐')
# 查询选中音乐名字
# 获取音乐列表的选中的索引
insert = self.label01.curselection()
# 获取音乐名
mname = self.label01.get(insert)
# 从关系表中删除用户与音乐行
self.myserbise.del_list(mname)
# 导入音乐后更新音乐列表
self.insert_mname()
except:
print('没有选择项')
MyService类:想要删除音乐,我们先得获得要删除音乐名的id,因为id才是与关系表关联的,然后再删除关系表,这样就算该用户删除了这首歌,也不会影响别的用户的歌单,音乐音乐表中这首歌还存在,当然为了节省资源,我们在删除用户关系表时可以再查询一下其他用户是不是也有这首歌,如果都没有,我们就把音乐库中的音乐信息也一起删除了
# 删除音乐
def del_list(self, mname):
# 查询要删除的音乐
sql = "select * from t_music where music_name=%s"
music = DBUtil().query_one(sql,mname)
# 删除用户关系表
sql = 'delete from t_list where mid=%s and uid=%s'
DBUtil().exeDML(sql, music[0], self.user[0])
sql = 'select mid from t_list where mid=%s'
mid = DBUtil().query_one(sql,music[0])
print('删除',mid)
if mid == None:
print('已无用户拥有这首歌,删除音乐表中该音乐')
sql = 'delete from t_music where id=%s'
DBUtil().exeDML(sql, music[0])
删除完音乐后,是不是还少个功能呢,那就是刷新列表,让用户知道自己刚才那首歌已经删除了,也就是再调用一次insert_mname()方法,这就是代码复用的好处
播放音乐
终于到最后一个功能啦,播放音乐我们需要引入一个新的库,那就是pygame,大家都知道pygame可以用来做游戏,我就曾经用pygame写过一个坦克大战的小游戏,那如今再用pygame,可不是为了做游戏,而是为了调用它里面的音乐播放方法
pygame.mixer.music.load(),需要我们传入文件路径,才能调用播放,所以这里还要再调用之前获取音乐名的方法,不过我好像没有把那段代码单独封装一下,所以这里就把他单独封装一下
PlayWinow类
def get_mname(self):
# 获取音乐列表的选中的索引
insert = self.label01.curselection()
# 获取音乐名
mname = self.label01.get(insert)
return mname
接下来就是
# 播放音乐
def play_music(self,event):
print('播放音乐')
# 查询选中音乐名字
mname = self.get_mname()
# 查询音乐地址
self.myserbise.play_music(mname)
下一个就是MyService类中真正的播放方法
# 播放音乐
def play_music(self,mname):
# 查询音乐路径
sql = 'select path from t_music where music_name=%s'
path = DBUtil().query_one(sql, mname)
print(path)
# 播放音乐
pygame.mixer.init()
pygame.mixer.music.load(path[0])
pygame.mixer.music.play()
到这里我们的程序基本写完了,接下来就是将代码里多余的代码封装后去掉,实现模块化,简化代码
代码
PlayWindow类
from MyService import MyService
import tkinter
from tkinter.filedialog import askopenfilenames
class PlayWindow:
def __init__(self, myserbise):
self.myserbise = myserbise
# 用户登录成功显示界面
def showWindow(self):
# 主窗口显示
top = tkinter.Tk()
top.title('音乐播放插件')
# 组件插入
self.createWidget(top)
# 将音乐名插入到label01上
self.insert_mname()
top.mainloop()
def createWidget(self,top):
# 按扭设置
btn01 = tkinter.Button(top, text='播放音乐')
btn02 = tkinter.Button(top, text='导入音乐')
btn03 = tkinter.Button(top, text='删除音乐')
btn01.grid(row=0, column=0, padx=3)
btn02.grid(row=0, column=3, padx=3)
btn03.grid(row=0, column=6, padx=3)
# 音乐列表
self.label01 = tkinter.Listbox(top)
self.label01.grid(row=1, column=0, columnspan=10)
# 事件方法
btn01.bind('<Button-1>', self.play_music)
btn02.bind('<Button-1>', self.import_music)
btn03.bind('<Button-1>', self.del_music)
# 插入音乐名至列表
def insert_mname(self):
self.label01.delete(0,tkinter.END)
music_name = self.myserbise.find_mname()
for mname in music_name:
self.label01.insert(tkinter.END, mname)
def get_mname(self):
# 获取音乐列表的选中的索引
insert = self.label01.curselection()
# 获取音乐名
mname = self.label01.get(insert)
return mname
# 播放音乐
def play_music(self,event):
print('播放音乐')
# 查询选中音乐名字
mname = self.get_mname()
# 查询音乐地址
self.myserbise.play_music(mname)
# 导入音乐
def import_music(self,event):
print('导入音乐')
music_file = askopenfilenames(title='导入的音乐',
initialdir='D:\music_file\cloud_music',
filetypes=[("音乐文件",".mp3")])
# 将音乐名及路径存入数据库
self.myserbise.add_music(music_file)
# 导入音乐后更新音乐列表
self.insert_mname()
# 删除音乐
def del_music(self,event):
try:
print('删除音乐')
# 查询选中音乐名字
mname = self.get_mname()
# 从关系表中删除用户与音乐行
self.myserbise.del_list(mname)
# 导入音乐后更新音乐列表
self.insert_mname()
except:
print('没有选择项')
if __name__ == '__main__':
uname = input('请输入用户名:')
password = input('请输入密码:')
myserbise = MyService()
playwindow = PlayWindow(myserbise)
# 判断用户是否存在
if myserbise.login(uname,password):
print('登录成功')
# 进行用户界面
playwindow.showWindow()
else:
print('登录失败')
MyService类
from dbutil import DBUtil
import pygame
class MyService:
def __init__(self):
self.user = None
# 用户登录
def login(self,uname,password):
sql = 'select * from t_user where uname=%s and password=%s'
self.user = DBUtil().query_one(sql,uname,password)
if self.user:
return True
else:
return False
# 查询音乐id
def music_id(self,music_name):
sql = "select * from t_music where music_name=%s"
return DBUtil().query_one(sql,music_name)
# 扫描t_music,将音乐名全部导出
def find_mname(self):
sql = "select m.music_name from t_music m,t_list t where m.id=t.mid and t.uid=%s"
return DBUtil().query_all(sql,self.user[0])
# 播放音乐
def play_music(self,mname):
# 查询音乐路径
sql = 'select path from t_music where music_name=%s'
path = DBUtil().query_one(sql, mname)
print(path)
# 播放音乐
pygame.mixer.init()
pygame.mixer.music.load(path[0])
pygame.mixer.music.play()
# 加入音乐
def add_music(self,files):
# print('123')
print(files)
for f in files:
start = f.rfind('/')+1
end = f.rfind('.mp3')
music_name = f[start:end]
path = f
# sql = "select * from t_music where music_name=%s"
# music = DBUtil().query_one(sql,music_name)
music = self.music_id(music_name)
if music:
print('音乐库已经有这首歌啦')
sql = 'select * from t_list where mid=%s and uid=%s'
t_list = DBUtil().query_one(sql, music[0], self.user[0])
if not t_list:
print('该用户还没有这首歌')
sql = 'insert into t_list(mid,uid) values(%s,%s)'
DBUtil().exeDML(sql, music[0], self.user[0])
else:
# 导入音乐库没有的音乐
print('音乐库里没有这首歌,写入开始')
sql = 'insert into t_music(music_name,path) values(%s,%s)'
DBUtil().exeDML(sql,music_name,path)
print('写入结束,开始写入关系表')
# 导入关系表,用户添加记录
music = self.music_id(music_name)
sql = 'insert into t_list(mid,uid) values(%s,%s)'
DBUtil().exeDML(sql, music[0], self.user[0])
print('结束')
print('结束 ')
# 删除音乐
def del_list(self, mname):
# 查询要删除的音乐
music = self.music_id(mname)
# 删除用户关系表
sql = 'delete from t_list where mid=%s and uid=%s'
DBUtil().exeDML(sql, music[0], self.user[0])
sql = 'select mid from t_list where mid=%s'
mid = DBUtil().query_one(sql,music[0])
print('删除',mid)
if mid == None:
print('已无用户拥有这首歌,删除音乐表中该音乐')
sql = 'delete from t_music where id=%s'
DBUtil().exeDML(sql, music[0])
DBUtil类
import pymysql
class DBUtil:
config={
'host': 'localhost',
'user': 'root',
'password': 'root',
'db': 'play_music_test',
'charset': 'utf8'}
def __init__(self):
self.connection = pymysql.connect(**DBUtil.config)
self.cursor = self.connection.cursor()
def close_file(self):
if self.cursor:
self.cursor.close()
if self.connection:
self.connection.close()
# 插入 修改 删除调用
def exeDML(self,sql,*args):
try:
# 执行sql
count = self.cursor.execute(sql,args)
# 提交事务
self.connection.commit()
return count
except Exception as e:
print(e)
if self.connection:
self.connection.rollback()
finally:
self.close_file()
# 单句查询
def query_one(self,sql,*args):
try:
# 执行sql
self.cursor.execute(sql,args)
# 获取结果集
return self.cursor.fetchone()
except Exception as e:
print(e)
finally:
self.close_file()
# 多句查询
def query_all(self,sql,*args):
try:
# 执行sql
self.cursor.execute(sql,args)
# 获取结果集
return self.cursor.fetchall()
except Exception as e:
print(e)
finally:
self.close_file()
if __name__ == '__main__':
dbutil = DBUtil()
# sql = 'insert into emp (empno, ename, sal)values(%s,%s,%s)'
# count = dbutil.exeDML(sql,9999,'xiaoxiao',12000)
# print(count)
# sql = 'select * from emp where empno=%s'
# emp = dbutil.query_one(sql,7788)
# print(emp)
sql = 'select * from emp'
emps = dbutil.query_all(sql)
for e in emps:
print(e, end='\n')
结果
我们需要注意自己写的.py文件当第三方库存入,最后是放在一个工作文件夹下,不然调用可能会出错。
我们登录成功后,效果如下,这时我们就可以进行一些相应的操作,真的和播放器差不多,就是丑了点,简单了点,功能少了点,哈哈哈
总结
音乐播放器告一段落了,后续还要更加努力的学习更多知识,将其更好的应用出来,在这个项目中,最大的收获不是学到了什么,而是不断解决代码bug的快乐感,还有刚开始对项目一些逻辑关系理解错了,想了许久,一步一步探索,解决问题,这样才是最好的,这也是我花一晚上写了这篇文章的原因,这真的很有成就感,哈哈哈,15211了,手快酸了,该休息啦
不过文章写得不够好,感觉太多赘余了,各位大佬不喜勿喷哈,但要是有发现我有哪些地方写错了,或者是哪些地方理解不好,请不要手软,一起加油!!!