![2e122e7602c18f2fbe2a2e9707650d24.png](https://i-blog.csdnimg.cn/blog_migrate/471e087bf045c16fd3bea7ac5215cdc0.jpeg)
问题描述:
在某个项目中自定义了一个mysql数据查询的模块,前期这个模块想着比较简单,然后该模块没有使用类来定义,只是使用了几个简单的函数,这就为修改时埋下了巨坑;
最开始这个mysql的模块只有一个查询函数,后面由于项目的不同查询需求,又定义了几个查询的函数,最开始写的时候,为了简单方便,直接就把pymysql中的连接以及游标的建立均放在了函数里面
![b93c1270a7e0ff42f5d78676686223e6.png](https://i-blog.csdnimg.cn/blog_migrate/4cbac8b8c27fe601cb5b11f86aee3c98.jpeg)
问题分析:
最近数据库那边修改了数据库的密码,然后想着有几个函数均需要改密码,就把数据库连接的几个字段放在了一个常量的配置文件,同时在数据库的模块中把数据库的连接建立作为全局变量,修改成这样
![76863ad1bf8183ec449083959f6bcb46.png](https://i-blog.csdnimg.cn/blog_migrate/0f02188276007f4cbb1f234d08c6d21d.png)
![3ca73d70e0f27c9ced966e7e6d33493c.png](https://i-blog.csdnimg.cn/blog_migrate/96c72d82ce6cbdc90eb50fad8c215d64.jpeg)
修改完成之后先在数据库模块中运行,运行结果正常,但是在另外的模块引用这个模块时,一直提示数据库查询的结果为None,继续看回查询模块的函数定义,使用了try except模块,也就是前面查询的时候出错了,看半天,楞是看不出哪里有问题,就使用了pycharm的debug功能,把断点设置在sql函数执行的位置
![eefbbd2c1107265378a8c1e8069fcffd.png](https://i-blog.csdnimg.cn/blog_migrate/a41b024f69fa418b15c2522d62c763e3.jpeg)
然后再根据debug一步步看,发现连接根本没有建立起来
![fc01e967d2e988dcf62973d1cadbcc3b.png](https://i-blog.csdnimg.cn/blog_migrate/903df387140fe12cf22cc70da2e61b78.jpeg)
再看看自己的代码,终于发现原来全局变量db = pymysql.connect(xxx)根本没有生效;
然后这个也根据自己在模块导入时候的方式有关,from xx import mysqlinfo 只导入了模块,而使用的时候只是调用了某个函数,最终导致全局变量没有生效。
解决方案:
1、导入的时候换种模式,直接改成from xx.mysqlinfo import * ,把整个模块所以的内容均引入进来,但是这种模式如果其他模块中存在类似的变量名或者函数名时,就会容易出现冲突,特别是项目越来越大,定义的模块和各种函数越来越多的时候需要谨慎使用;
2、各个函数单独建立db = pymysql.connect(xxx)模式,同时把连接时候需要的各个变量放在一个公共的config的常量文件中,这样导入的时候就不会相互干扰了,数据库连接字段修改了也只需要修改配置文件中的常量就可以了,但是这种方式有违背Pythonic的特性,就是代码过于冗余;
3、第三种模式是推荐模式,就是将mysqlinfo封装成一个类,在使用的时候先实例化这个类,这样就可以避免全局变量的问题
![0dd41a9f51e9b3ebdbedc7887eb380ef.png](https://i-blog.csdnimg.cn/blog_migrate/e4f8d4ef78d7070a2e64f1d38c2eefe5.jpeg)