基於Python的接口自動化-pymysql模塊操作數據庫


引言

        在進行功能或者接口測試時常常需要通過連接數據庫,操作和查看相關的數據表數據,用於構建測試數據、核對功能、驗證數據一致性,接口的數據庫操作是否正確等。因此,在進行接口自動化測試時,我們一樣繞不開接口和數據庫的交互,我們需要用代碼連接數據庫,通過操作數據庫完成數據的准備、環境檢查以及數據庫斷言的功能。在python3中,使用python操作MySQL數據庫需要使用到第三方庫:pymysql,該模塊本質上就是一個套接字的客戶端軟件包,它提供了諸多連接數據庫、操作數據庫表等一系列的方法。

一、PyMySQL安裝

1.在windows環境下安裝

由於python3.6及以上版本安裝python后就自帶了pip3,python版本低於3.6的,手動安裝下pip即可,因此可以直接使用pip安裝該模塊

pip3 install pymysql 

2.在linux環境下安裝

下載安裝pymysql的tar包,解壓后,進入解壓的目錄下,按如下安裝即可:

[root@localhost opt]#tar -xzvf PyMySQL-0.7.11.tar.gz
[root@localhost opt]#cd PyMySQL-0.7.11
[root@localhost PyMySQL-0.7.11]#python36 setup.py install

3.在PyCharm中安裝

在PyCharm中直接檢索該模塊,並安裝,步驟如下:

二、Python操作數據庫

因為方便測試,我們首先在mysql數據庫創建測試表:userinfo,表信息如下:

 

有了數據庫和數據表后,我們就可以導入pymysql模塊,使用該模塊下封裝的方法實現數據庫操作

數據庫連接

pymysql提供的方法如下:

1. 建立數據庫連接 conn = pymysql.connect()
2. 從連接建立操作游標 cur = conn.cursor()
3. 使用游標執行sql(讀/寫) cur.execute(sql)
4. 獲取結果(讀)/ 提交更改(寫) cur.fetchall() / conn.commit()
5. 關閉游標及連接 cur.close();conn.close()

代碼示例:

import pymysql
# 建立連接
connection = pymysql.connect(host='119.29.78.234', port=3306, user='root', password='dhcc@2020', db='test123')
cursor = connection.cursor()       # 創建游標
cursor.execute("SELECT * FROM userinfo")   #使用execute()方法執行SQL語句
data = cursor.fetchall()  #使用fetall()獲取全部數據
print(data)
cursor.close()   #關閉游標和數據庫的連接
connection.close()

#運行結果
((1, '艾佛森', '123'), (2, '科比', '123'), (3, '詹姆斯', '123'), (4, '庫里', '123'))

什么是游標? 游標類似文件句柄,可以逐條的訪問數據庫執行結果集。pymysql中只能通過游標來執行sql和獲取結果

以上代碼執行后,默認返回的是一個嵌套元組數據類型

數據庫增刪改查

 查詢操作:

使用cur.execute(), 執行數據庫查詢后無返回的是影響的行數,而非查詢結果。我們要使用cur.fetchone()/cur.fetchmany()/cur.fetchall()來獲取查詢結果
cur.fetchone(): 獲取一條數據(同時獲取的數據會從結果集刪除),返回元組
cur.fetchmany(3): 獲取多條數據,返回嵌套元組
cur.fetchall(): 獲取所有數據,返回嵌套元組

代碼示例:

查詢單條數據:

import pymysql
db_config = {
      "host":"119.29.78.234",
       "port":3306,
       "user":"root",
       "password":"dhcc@2020",
       "db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchone()    # fetchone()第一次只能查詢表中的首行數據
print(res)
res = cursor.fetchone()    # 第二次查詢下一行數據
print(res)
cursor.close()
db.close()

# 返回結果

((1, '艾佛森', '123'))

((2, '科比', '123'))

查詢多條數據:

import pymysql
db_config = {
      "host":"119.29.78.234",
       "port":3306,
       "user":"root",
       "password":"dhcc@2020",
       "db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchmany(3)   # 第一次查詢表中的前3行數據
print(res)
res = cursor.fetchmany(3)    # 第二次查詢下一個3行的數據
print(res)
cursor.close()
db.close()
#返回結果 ((1, '艾佛森', '123'), (2, '科比', '123'), (3, '詹姆斯', '123')) ((4, '庫里', '123'),)

查詢所有數據:

import pymysql
db_config = {
      "host":"119.29.78.234",
       "port":3306,
       "user":"root",
       "password":"dhcc@2020",
       "db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "SELECT * FROM userinfo"
cursor.execute(sql)
res = cursor.fetchall()   # 第一次查詢表中的所有數據
print(res)
res = cursor.fetchall()    # 第二次查詢無數據
print(res)
cursor.close()
db.close()
#返回結果 ((1, '艾佛森', '123'), (2, '科比', '123'), (3, '詹姆斯', '123'), (4, '庫里', '123')) ()

 默認都是返回元組的數據類型,看起來不太直觀,因此,在實例化時可以將游標設置成如下這樣,就可以返回字典類型的數據

cursor = db.cursor(cursor=pymysql.cursors.DictCursor)

#返回結果

[{'username': '艾佛森', 'id': 1, 'passwd': '123'}, {'username': '科比', 'id': 2, 'passwd': '123'}, {'username': '詹姆斯', 'id': 3, 'passwd': '123'}, {'username': '庫里', 'id': 4, 'passwd': '123'}]

增刪改操作:

在進行增刪改,執行修改數據庫的操作后不立即生效,使用連接conn.commit()提交后才生效,支持事物及回滾

 代碼示例:

import pymysql
db_config = {
      "host":"119.29.78.234",
       "port":3306,
       "user":"root",
       "password":"dhcc@2020",
       "db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "INSERT INTO userinfo(username,passwd) VALUES('克萊','123')"
#sql = "UPDATE userinfo SET username = '奧尼爾' WHERE username = '科比'"  # 修改數據
#sql = "DELETE FROM username WHERE username ='奧尼爾'"                    # 刪除數據
try:
    cursor.execute(sql)
    db.commit()
except Exception as e :   # 執行異常回滾
    db.rollback()
cursor.close()
db.close()
#或者在execute提供需要插入的數據
import pymysql
db_config = {
      "host":"119.29.78.234",
       "port":3306,
       "user":"root",
       "password":"dhcc@2020",
       "db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "INSERT INTO userinfo(username,passwd) VALUES(%s,%s)"
try:
    cursor.execute(sql,("克萊","123"))
    db.commit()
except Exception as e :
    db.rollback()
cursor.close()
db.close()
#批量插入數據
import pymysql
db_config = {
      "host":"119.29.78.234",
       "port":3306,
       "user":"root",
       "password":"dhcc@2020",
       "db":"test123"
}
db = pymysql.connect(**db_config)
cursor = db.cursor()
sql = "INSERT INTO userinfo(username,passwd) VALUES(%s,%s)"
try:
    cursor.executemany(sql,[("韋德","123"),("字母哥","123")])
    db.commit()
except Exception as e :
    db.rollback()
cursor.close()
db.close()

封裝數據庫操作

由於經常要使用到數據庫操作,建議將所有數據庫操作封裝成公用的數據庫模塊

封裝的代碼示例如下:

import pymysql.cursors

class Operation_mysql(object):
    def __init__(self):
        # 建立連接
        db_config = {
            "host": "119.29.78.234",
            "port": 3306,
            "user": "root",
            "password": "dhcc@2020",
            "db": "test123"
        }
        self.connection = pymysql.connect(**db_config)
        # 創建游標
        self.cursor = self.connection.cursor()

    def execute_sql(self, sql):
        try:
            self.cursor.execute(sql)
            self.connection.commit()
        except Exception as e:  # 執行異常回滾
            db.rollback()

    def get_data(self):
        data = self.cursor.fetchone()
        #data = self.cursor.fetchall() # 查詢所有數據
        return data

    def close_mysql(self):
        # 關閉游標
        self.cursor.close()
        # 關閉數據庫連接
        self.connection.close()

這樣封裝后后續接口測試用例需要操作數據庫時,就可以引入該模塊,實例化對象調用該模塊下的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM