前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《颠覆你的 Python 接口自动化测试》04 - Python 操作 MySQL 数据库

《颠覆你的 Python 接口自动化测试》04 - Python 操作 MySQL 数据库

作者头像
caoqi95
发布2019-03-27 17:25:56
1.1K0
发布2019-03-27 17:25:56
举报

Python 操作 MySQL

  • 操作流程

image

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

代码语言:javascript
复制
conn = pymysql.connect()

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

代码语言:javascript
复制
cur = conn.cursor()

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

代码语言:javascript
复制
cur.execute(sql)

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

代码语言:javascript
复制
conn.commit()

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

代码语言:javascript
复制
cur.close()

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

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

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

代码语言:javascript
复制
# -*- 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)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.08.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python 操作 MySQL
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档