美文网首页
Python篇-ini配置文件封装

Python篇-ini配置文件封装

作者: 左手代码__右手诗 | 来源:发表于2019-03-18 20:40 被阅读0次

    对数据库信息的简单封装

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

    import pymysql
    
    class 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"
            )
    

    这不是常规操作,因为这会使维护成本增加。
    所以,我在当前目录新建了一个名为: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 configparser
    
    class ReadIni:
        def __init__(self,file_path=None):
            if file_path == None:
                self.file_path = "G:/Autointerface/db_config.ini"
            else:
                self.file_path = file_path
    
        def Read_Ini(self):
            conf = configparser.ConfigParser()
            conf.read(self.file_path)
            return conf
    
        def Get_Value_Of_Conf(self,key,section=None):
            if section == None:
                section = "api_test"
            result = self.Read_Ini().get(section,key)
            return result
    
    if __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 ReadIni
    
    class 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文件的配置和读取,先就这样。

    相关文章

      网友评论

          本文标题:Python篇-ini配置文件封装

          本文链接:https://www.haomeiwen.com/subject/fxbbmqtx.html