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

Python 操作 MySQL

操作流程

cc36312e26cf

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值