008. (4.8) 储存音乐下载记录至MySQL

储存音乐下载记录至MySQL

刚看完一些理论知识,打开mysql服务又无法启动了,观察错误信息,一番周折,其中主要借鉴了两篇博客:
win10安装mysql时 ,mysqld --initialize --console报错
mysql安装出现Errcode: 2 - No such file or directory错误的解决办法

终于开始操作,将文本储存在MySQL数据库中。除了认真啃书本,也有借鉴博客:
pymysql模块使用

typing时遇到的几个关键点

1.说来心酸,一度忘记应是先创建连接,再创建数据库。

2.插入数据时,可选择直接用格式化的%s 来实现 。几个 Value 写几个%s,我们只需要在 execute()方法的第 一个参数传入该 SQL 语句,Value 值用统 一的元组传过来就好了。这样的写法既可以避免字符串拼接的麻烦,又可以避免引号冲突的问题。

3.之后值得注意的是,需要执行数据库对象的 **commit ()**方法才可实现数据插入,这个方法才是真正将语句提交到数据库执行的方法 。对于数据插入、更新、删除操作,都需要调用该方法才能生效。接下来,我们加了一层异常处理 。如果执行失败,则调用 **rollback ()**执行数据回滚(涉及事务机制、属性的问题),相当于什么都没有发生过。

4.SQL 语句如能根据字典动态构造, 元组也动态构造,才可实现通用的插入方法,不需要再去修改 SQL 语句和插入操作了。

5.调用 cursor的 rowcount 属性获取查询结果的条数。

6.fetchall ()方法获取一个字段的所有数据。它的内部实现有一个偏移指针用来指向查询结果,最开始偏移指针指向第一条数据,取一次之后,指针偏移到下一条数据,这样再取的话,就会取到下一条数据了。

7.此外,我们还可以用 while 循环加 fetchone ()方法来获取所有数据,而不是用 fetchall ()全部一起获取出来。fetchone ()将结果以元组形式全部返回。如果数据量很大,那么占用的开销会非常高。

8.sql注入问题:用户提交带有恶意的数据与SQL语句进行字符串方式的拼接,从而影响了SQL语句的语义,最终产生数据泄露的现象。首先明确一点:–是sql语句的注释,他会注释掉–sql后面的语句。

如何防止SQL注入?

  • SQL语句参数化
  • SQL语言中的参数使用%s来占位,此处不是python中的字符串格式化操作
    将SQL语句中%s占位所需要的参数存在一个列表中,把参数列表传递给execute方法中第二个参数
    在这里插入图片描述
    在这里插入图片描述
# 问题原因原来是我们对sql进行字符串拼接
# sql="select * from user where user='%s' and pwd='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from user where user=%s and pwd=%s" # 注意%s需要去掉引号,因为pymysql会自动为我们加上
res=cursor.execute(sql,[user,pwd])                # pymysql模块自动帮我们解决sql注入的问题,只要按照pymysql的规矩来。

在这里插入图片描述
如图,成功实现简单的数据储存功能。 但在整个过程中,当解决几个关键bug时,我又发现不少健壮性的小问题(最近主要是交互部分和数据格式方面)。一名程序猿,真的需要培养缜密的思维。代码中的各类语句和参数都能建立联系,而自己应该清楚程序的整体以及这些联系,才能写出更健壮的程序。

小结

通过接触pymysql库,重温SQL语法,还是实现了音乐下载记录的储存。

今天也经历不少找bug过程,首先要定位错误处,再根据与其他代码的关联寻错。我也进一步熟悉断点测试,当然print测试也可以。在这里贴一下另一篇看到的有关断点的文章:
Pycharm如何打断点

此外,一次次意识到,长时间工作,注意力和效率都受影响。。(有点麻木了吧)适时休息也挺重要。

猜你喜欢

转载自blog.csdn.net/u013598957/article/details/105393800
4.8