Python篇-ini配置文件封装

对数据库信息的简单封装
自动化项目中,基于PO模型的思考,应该把数据和代码分离。这样做的意义在于,很多时候我们需要修改数据,这时候不需要频繁去改代码,只需要操作单独的数据文件即可,这样会使代码维护成本得到一定程度地降低。下面介绍一个对数据库信息的简单封装实例。
第一版的代码是这样的:
db.py

import pymysqlclass HandleDatabase: def __init__(self):#构造函数,实例化类时触发 self.conn = pymysql.connect\ ( host = "127.0.0.1", user = "root", password =" XXXX", db = "api_test" ) self.cur = self.conn.cursor()def __del__(self):#析构函数,删除实例对象时触发 self.cur.close() self.conn.close()#数据库查询操作 def QueryDb(self,sql): self.cur.execute(sql) result = self.cur.fetchall() return result#修改数据库操作 def ChangeDb(self,sql): try: self.cur.execute(sql) self.conn.commit() except Exception as e: self.conn.rollback() print(str(e))

解释下各部分的作用:
init函数,在把类实例化的时候调用,作用是连接数据库,建立游标。
del函数,在删除实例化对象的时候调用,作用是关闭游标,关闭数据库链接。
QueryDb函数,相对比较好理解,封装的是查询数据库的操作(查)。
ChangeDb函数,同样的,是对操作数据库的封装(增,删,改)。
过程很清楚,也很直白,但是有个问题是,假如将来想要修改被链接的数据库的信息,那就需要去改代码,就是这一部分:
( host = "127.0.0.1", user = "root", password =" XXXX", db = "api_test" )

【Python篇-ini配置文件封装】这不是常规操作,因为这会使维护成本增加。
所以,我在当前目录新建了一个名为:db_config.ini的文件(这里是我的配置文件,用来配置数据库的信息)
文件里面我写了如下内容:
db_config.ini
[api_test] host=127.0.0.1 user=root password=XXXX db=api_test

配置文件有了,当然你可以在db.py文件中这样写:
db.py
import pymysql import configparser### class HandleDatabase: def __init__(self):#构造函数,实例化类时触发 self.conf = configparser.ConfigParser()### self.conf.read("G:/Autointerface/db_config.ini")### self.host = self.conf.get("api_test","host")### self.user = self.conf.get("api_test", "user")### self.password = self.conf.get("api_test", "password")### self.db = self.conf.get("api_test", "db")### self.conn = pymysql.connect\ ( host = self.host, user = self.user, password = self.password, db = self.db ) self.cur = self.conn.cursor()def __del__(self):#析构函数,删除实例对象时触发 self.cur.close() self.conn.close()#数据库查询操作 def QueryDb(self,sql): self.cur.execute(sql) result = self.cur.fetchall() return result#修改数据库操作 def ChangeDb(self,sql): try: self.cur.execute(sql) self.conn.commit() except Exception as e: self.conn.rollback() print(str(e))

你可能注意到了,我在之前的db.py文件里面加了哪些内容(###的),其中这句话:self.conf.read("G:/Autointerface/db_config.ini")
里面的路径就是之前新建的db_config.ini文件的绝对路径。
好像看起来没什么问题,但是想想,如果我文件的路径变了呢?又或者section不是api_test了呢?我是不是还是需要修改db.py文件啊,是的。
于是,我又新建了一个文件,叫做read_ini.py,顾名思义,就是读取配置文件的py文件。文件里面写了如下内容:
read_ini.py
import configparserclass ReadIni: def __init__(self,file_path=None): if file_path == None: self.file_path = "G:/Autointerface/db_config.ini" else: self.file_path = file_pathdef Read_Ini(self): conf = configparser.ConfigParser() conf.read(self.file_path) return confdef Get_Value_Of_Conf(self,key,section=None): if section == None: section = "api_test" result = self.Read_Ini().get(section,key) return resultif __name__ == "__main__": read_ini = ReadIni() print(read_ini.Get_Value_Of_Conf("host"))

解释一下:
三个函数,第一个构造函数init,函数内容很清楚地回答了上面第一个疑问(如果我文件的路径变了呢?),因为如果你传了路径,那路径就是你传的;如果你没传,那就用默认的(G:/Autointerface/db_config.ini)。第二个读取函数,就是给ReadIni实例化了一个对象而已。第三个函数,就是获取你需要的value的函数(这里的value指的是127.0.0.1,root等等),他可以根据你传的参数 ,来给你对应的value。此处需要两个参数,一个是section,一个是key(这里section和section不能颠倒位置哦,可以Google下 位置参数和默认参数的区别,你就能知道答案了),同样,如果不传section参数,那他就是默认的api_test。其实这里后面两个函数可以写在一起的,但是这样写通易懂,你觉得呢?
接下来就是最后一步了,来看看最后的db.py文件的样子吧:
db.py
import pymysql from read_ini import ReadIniclass HandleDatabase: def __init__(self):#构造函数,实例化类时触发 read_ini_result = ReadIni() host = read_ini_result.Get_Value_Of_Conf("host") user = read_ini_result.Get_Value_Of_Conf("user") password = read_ini_result.Get_Value_Of_Conf("password") db = read_ini_result.Get_Value_Of_Conf("db")self.conn = pymysql.connect\ ( host = host, user = user, password = password, db = db ) self.cur = self.conn.cursor()def __del__(self):#析构函数,删除实例对象时触发 self.cur.close() self.conn.close()#数据库查询操作 def QueryDb(self,sql): self.cur.execute(sql) result = self.cur.fetchall() return result#修改数据库操作 def ChangeDb(self,sql): try: self.cur.execute(sql) self.conn.commit() except Exception as e: self.conn.rollback() print(str(e))

看起来好像没有简洁多少呢。今天主要记录下,ini文件的配置和读取,先就这样。

    推荐阅读