小言_互联网的博客

Python接口测试实战3(上)- Python操作数据库

284人阅读  评论(0)

本节内容

  • 数据库操作
  • 封装数据库操作

前言

在功能、接口测试中常常需要通过数据库的操作,来准备数据、检测环境及核对功能、接口的数据库操作是否正确。
自动化测试中,就需要我们用代码连接数据库自动完成数据准备、环境检查及数据库断言的功能。
使用Python操作MySQL数据库这里我们需要用到三方库PyMySQl

安装方法:pip install pymysql

数据库操作#

  1. 建立数据库连接 conn = pymysql.connect()
  2. 从连接建立操作游标 cur = conn.cursor()
  3. 使用游标执行sql(读/写) cur.execute(sql)
  4. 获取结果(读)/ 提交更改(写) cur.fetchall() / conn.commit()
  5. 关闭游标及连接 cur.close();conn.close()

  
  1. import pymysql
  2. # 1. 建立连接
  3. conn = pymysql.connect(host= '127.0.0.1',
  4. port= 3306,
  5. user= 'root',
  6. passwd= '123456', # password也可以
  7. db= 'api_test',
  8. charset= 'utf8') # 如果查询有中文需要指定数据库编码
  9. # 2. 从连接建立游标(有了游标才能操作数据库)
  10. cur = conn.cursor()
  11. # 3. 查询数据库(读)
  12. cur.execute( "select * from user where name='张三'")
  13. # 4. 获取查询结果
  14. result = cur.fetchall()
  15. print(result)
  16. # 3. 更改数据库(写)
  17. cur.execute( "delete from user where name='李四'")
  18. # 4. 提交更改
  19. conn.commit() # 注意是用的conn不是cur
  20. # 5. 关闭游标及连接
  21. cur.close()
  22. conn.close()

什么是游标? 游标类似文件句柄,可以逐条的访问数据库执行结果集。pymysql中只能通过游标来执行sql和获取结果

查询操作
使用cur.execute(), 执行数据库查询后无返回的是影响的行数,而非查询结果。我们要使用cur.fetchone()/cur.fetchmany()/cur.fetchall()来获取查询结果

  • cur.fetchone(): 获取一条数据(同时获取的数据会从结果集删除),返回元祖('张三','123456')
  • cur.fetchmany(3): 获取多条数据,返回嵌套元祖(('张三','123456'),('李四','123456'),("王五","123456"))
  • cur.fetchall(): 获取所有数据,返回嵌套元祖,(('张三','123456'),)(只有一条数据时)

注意: 获取完数据后,数据会从数据集中删除,再次获取获取不到,如:


  
  1. cur .execute(select * from user where name='张三')
  2. print(cur.fetchone()) # 结果: ('张三',' 123456')
  3. print(cur.fetchone()) # 结果: None
  4. print(cur.fetchall()) # 结果:()

所以我们需要重复使用查询结果时,需要将查询结果赋给某个变量


  
  1. cur.execute( select * from user where name = '张三')
  2. result = cur.fetchall()
  3. print( result) # 结果: ( '张三', '123456')
  4. print( result) # 结果: ( '张三', '123456')

修改操作
执行修改数据库的操作后不立即生效,使用连接conn.commit()提交后才生效,支持事物及回滚


  
  1. try:
  2. cur.execute( "insert into user (name,password) values ('张三', '123456')")
  3. cur.execute( "insert into user (name, passwd) values ('李四'), '123456'") # 此处sql出错
  4. conn.commit() # 使用连接提交所有更改
  5. except Exception as e:
  6. conn.rollback() # 回滚所有更改(注意用的是conn)
  7. print( str(e))

封装数据库操作

由于经常要使用到数据库操作,建议将所有数据库操作封装成公用的数据库模块

  1. 新建db.py, 代码如下:

  
  1. import pymysql
  2. # 获取连接方法
  3. import pymysql
  4. # 获取连接方法
  5. def get_db_conn():
  6. conn = pymysql.connect(host= '127.0.0.1',
  7. port= 3306,
  8. user= 'test',
  9. passwd= '123456',
  10. db= 'api_test',
  11. charset= 'utf8') # 如果查询有中文,需要指定测试集编码
  12. return conn
  13. # 封装数据库查询操作
  14. def query_db( sql):
  15. conn = get_db_conn() # 获取连接
  16. cur = conn.cursor() # 建立游标
  17. cur.execute(sql) # 执行sql
  18. result = cur.fetchall() # 获取所有查询结果
  19. cur.close() # 关闭游标
  20. conn.close() # 关闭连接
  21. return result # 返回结果
  22. # 封装更改数据库操作
  23. def change_db( sql):
  24. conn = get_db_conn() # 获取连接
  25. cur = conn.cursor() # 建立游标
  26. try:
  27. cur.execute(sql) # 执行sql
  28. conn.commit() # 提交更改
  29. except Exception as e:
  30. conn.rollback() # 回滚
  31. finally:
  32. cur.close() # 关闭游标
  33. conn.close() # 关闭连接
  34. # 封装常用数据库操作
  35. def check_user( name):
  36. # 注意sql中''号嵌套的问题
  37. sql = "select * from user where name = '{}'". format(name)
  38. result = query_db(sql)
  39. return True if result else False
  40. def add_user( name, password):
  41. sql = "insert into user (name, passwd) values ('{}','{}')". format(name, password)
  42. change_db(sql)
  43. def del_user( name):
  44. sql = "delete from user where name='{}'". format(name)
  45. change_db(sql)

相比用例中直接使用sql操作数据库,封装常用的数据库操作会更安全

  1. 调用方法(其他模块)

  
  1. from db import *
  2. if check_user("张三"):
  3. del_user( "张三")

补充:另一种封装方法

由于上面这种封装方法,每一次查询都会建立一次数据库连接,效率较低,也可以采用下面面向对象的封装方法

db2.py


  
  1. import pymysql
  2. class DB:
  3. def __init__( self):
  4. self.conn = pymysql.connect(host= '127.0.0.1',
  5. port= 3306,
  6. user= 'root',
  7. passwd= '123456', # passwd 不是 password
  8. db= 'api_test')
  9. self.cur = self.conn.cursor()
  10. def __del__( self): # 析构函数,实例删除时触发
  11. self.cur.close()
  12. self.conn.close()
  13. def query( self, sql):
  14. self.cur.execute(sql)
  15. return self.cur.fetchall()
  16. def exec( self, sql):
  17. try:
  18. self.cur.execute(sql)
  19. self.conn.commit()
  20. except Exception as e:
  21. self.conn.rollback()
  22. print( str(e))
  23. def check_user( self,name):
  24. result = self.query( "select * from user where name='{}'". format(name))
  25. return True if result else False
  26. def del_user( self, name)
  27. self. exec( "delete from user where name='{}'". format(name))

使用方法


  
  1. from db2 import DB:
  2. db = DB() # 实例化一个数据库操作对象
  3. if db. check_user( "张三"):
  4. db. del_user( "张三")

后言

  • 数据库连接信息建议写到配置文件中,从配置文件中读取
  • sql语句建议先在手工测试一下没有语法问题再进行封装
  • 通过封装各种sql可以完成各种业务操作
  • 更改数据库有风险,操作需谨慎!!!

转载:https://blog.csdn.net/ZangKang1/article/details/128487732
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场