美文网首页颠覆你的Python实践软件测试之路
《颠覆你的Python接口自动化测试》04-Python操作My

《颠覆你的Python接口自动化测试》04-Python操作My

作者: 捡个七 | 来源:发表于2017-08-29 22:54 被阅读170次

    Python操作MySQL

    • 操作流程
      image

    1.先创建数据库连接,与数据库完成连接,使用语句如下:

    conn = pymysql.connect()
    

    2.创建游标,游标是用来开拓出一片区域,暂时保存我们所操作的数据,使用语句如下:

    cur = conn.cursor()
    

    3.在创建的游标下执行SQL,这样就不会影响到数据库的其他内容,使用语句如下:

    cur.execute(sql)
    

    4.提交游标数据到数据库,使用语句如下:

    conn.commit()
    

    5.关闭游标,使用语句如下:

    cur.close()
    

    6.关闭数据库连接,使用语句如下:

    conn.close()
    
    • 遇到的问题与解决方法
      • 第一个问题:pymysql模块的导入
        python2.x版本导入的是MySQLdb这个模块,而python3.x导入的是pymysql,百度了下,成功导入了pymysql模块
      • 第二个问题:数据库的连接
        一开始并不知道怎么使用MySQL的本地连接和Navicat,多方查找和学习后,学会了搭建本地数据库环境,这个解决之后,之前运行一堆报错的代码问题也基本迎刃而解了。
      • 第三个问题:插入多条数据
        cur.execute()只能执行单条数据,在下面的operate_more方法下仍使用这个就行不通了,因为是多条数据,所以要使用批量执行语句cur.executemany()
    • 完整源码

    根据课件完善的代码如下:

    # -*- coding:utf-8 -*-
    '''
    定义对mysql数据库基本操作的封装
    1.包括基本的单条语句操作,删除、修改、更新
    2.独立查询单条、查询多条数据
    3.独立添加多条数据
    '''
    
    import pymysql
    import logging
    import os
    
    
    class OperationDbInterface(object):
    
        def __init__(self):
            self.conn = pymysql.connect(host='localhost',
                                        user='root',
                                        password='root',
                                        db='test',
                                        port=3306,
                                        charset='utf8',
                                        cursorclass=pymysql.cursors.DictCursor)  # 创建数据库连接
            self.cur = self.conn.cursor()  # 创建游标
    
        # 定义单条数据操作,增删改
        def op_sql(self, params):
            try:
                self.cur.execute(params)  # 执行sql语句
                self.conn.commit()
                return True
            except pymysql.Error as e:
                print("MySQL Error %d: %s" % (e.args[0], e.args[1]))
                logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
                                    level=logging.DEBUG,
                                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levekname)s %(message)s')
                logger = logging.getLogger(__name__)
                logger.exception(e)
                return False
    
        # 查询表中单条数据
        def select_one(self, condition):
            try:
                self.cur.execute(condition)
                results = self.cur.fetchone()  # 获取一条结果
            except pymysql.Error as e:
                results = 'sql0001'  # 数据库执行失败
                print("MySQL Error %d: %s" % (e.args[0], e.args[1]))
                logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
                                    level=logging.DEBUG,
                                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
                logger = logging.getLogger(__name__)
                logger.exception(e)
            finally:
                return results
    
        # 查询表中所有数据
        def select_all(self, condition):
            try:
                self.cur.execute(condition)
                self.cur.scroll(0,  mode='absolute')  # 光标回到初始位置
                results = self.cur.fetchall()  # 返回游标中所有结果
            except pymysql.Error as e:
                results = 'sql0001'  # 数据库执行失败
                print("MySQL Error %d: %s" % (e.args[0], e.args[1]))
                logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
                                    level=logging.DEBUG,
                                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
                logger = logging.getLogger(__name__)
                logger.exception(e)
            finally:
                return results
    
        # 定义更多数据操作(插入数据,更新数据,删除数据)
        def operate_more(self, condition, params):
            try:
                self.cur.executemany(condition, params)
                self.conn.commit()
                return True
            except pymysql.Error as e:
                results = 'sql0001'  # 数据库执行失败
                print("MySQL Error %d: %s" % (e.args[0], e.args[1]))
                logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
                                    level=logging.DEBUG,
                                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levekname)s %(message)s')
                logger = logging.getLogger(__name__)
                logger.exception(e)
                return results
    
        # 数据库关闭
        def __del__(self):
            if self.cur is not None:
                self.cur.close()
            if self.conn is not None:
                self.conn.close()
    
    
    if __name__ == "__main__":
        test = OperationDbInterface()  # 实例化类
        result_1 = test.select_one('select*from persons')  # 查询一条数据
        print(result_1)
        result_2 = test.select_all('select*from persons')  # 查询所有数据
        print(result_2)
        result_3 = test.operate_more('insert into persons  values (%s, %s, %s)', (4, '付千', '兰州'))  # 插入一条数据
        print(result_3)
        # tmp = ((4, '付千', '兰州'), (5, '韩以', '温州'), (6, '曹七', '丽水'))
        # result_4 = test.operate_more("insert into persons  values (%s, %s, %s)", tmp)  # 插入三条数据
        # print(result_4)
        result_5 = test.operate_more('delete from persons where NAME = %s', ('李阳'))  # 删除一条数据
        print(result_5)
        result_6 = test.operate_more('update persons set NAME = %s where NAME = %s', ('陈浩', '陈昊'))  # 修改一条数据
        print(result_6)
    
    
    

    相关文章

      网友评论

        本文标题:《颠覆你的Python接口自动化测试》04-Python操作My

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