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文件的配置和读取,先就这样。
推荐阅读
- 2018年11月19日|2018年11月19日 星期一 亲子日记第144篇
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- 拍照一年啦,如果你想了解我,那就请先看看这篇文章
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- 亲子日记第186篇,2018、7、26、星期四、晴
- python自定义封装带颜色的logging模块
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 两短篇