python 操作数据库

**测试需要
用例检查点
用例数据准备
手工测试:使用工具
自动化测试:
编程语言访问数据库
原理:应用程序(包括应用app,驱动Driver就是客户端库)发送请求,发送程序给数据库服务进程(Server process)
数据库:是存储数据的逻辑的集合。
安装mysql(在Linux上)

安装虚拟机,虚拟机中安装Linux

请大家自行百度搜索,安装虚拟机管理器 virtualbox 或者 vmvareplayer, 创建 64位 虚拟机, 安装centos镜像
cetos6.5 下载地址 : http://archive.kernel.org/centos-vault/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso**

安装好以后,以root用户登录

安装 Mysql 服务

1 执行下面命令安装mysql 5.6 基于 centos 6.5 的yum源**

wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
rpm -ivh mysql-community-release-el6-5.noarch.rpm

2 执行下面命令安装 mysql server 和 mysql devel

yum install mysql-server      #安装mysql数据库管理系统
yum install mysql-devel       #安装一下,可能以后一些mysql客户端工具需要编译

启动mysql

执行命令 service mysqld start #启动数据库服务 service mysqld status查看数据库进程

创建 数据库用户 账号

## 执行命令 mysql 启动 mysql 命令行客户端,在交互式命令行输入

CREATE USER 'songqin'@'localhost' IDENTIFIED BY 'songqin';      #创建访问数据的账号,前面是账号,后面是密码,允许用户在本机登录
CREATE USER 'songqin'@'%' IDENTIFIED BY 'songqin';     #远程的网络课可以登录
然后 给 数据库用户 账号 songqin 赋予超级权限

GRANT ALL ON *.* TO 'songqin'@'localhost';    #给账号赋予所有权限
GRANT ALL ON *.* TO 'songqin'@'%';      
执行quit 退出 mysql client

创建数据库 (为了演示用的)

下载数据库文件

wget --no-check-certificate https://github.com/jcyrss/songqin-testdev/raw/master/webapi/doc/plesson.sql

## 执行如下命令,将plesson.sql文件 导入数据库中

mysql -usongqin -psongqin < plesson.sql    #plesson.sql就是下载下来的文件,是执行了一个脚本

执行如下命令,让mysqld服务开机启动

chkconfig --level 2345 mysqld on

修改教管系统配置文件

将教管系统 访问数据库从本地的sqlite改为使用远程mysql 服务*
修改配置文件 restapi-teach\backend\project\settings.py #把前面的sqlite3的文件注释掉**

注意,下面的ip地址一定要写对

   DATABASES = {
           'default': {
               'ENGINE': 'django.db.backends.mysql',
               'NAME': 'plesson',
               'USER': 'songqin',
               'PASSWORD': 'songqin',
               'HOST': '你机器的ip地址',   #就是改这个。可以用ip地址,也可以用域名。填数据库的服务地址,(阿里云,虚拟机的ip地址等)
               'PORT': '3306',
               'CONN_MAX_AGE': 0, 
               'OPTIONS': {
                      "init_command": "SET storage_engine=INNODB",
               }
           }
        }
重新启动

打开防火墙端口

iptables -I INPUT -p TCP --dport 3306 -j ACCEPT;/sbin/service iptables save

Heidisql工具连接访问数据库

打开 https://www.heidisql.com/

下载安装portableversion**

安装 mysqlclient 客户端库

在自己的客户端机器上,通常也就是教管系统所在机器上,运行如下命令, mysqlclient 客户端库

pip install mysqlclient==1.3.12

python操作mysql

MySQLclient库
第三方开发的,Django推荐
文档:https://mysqlclient.readthedocs.io/
安装
pip install mysqlclient==1.3.12 #指定版本,因为最新版本,还不可以编译呢 python用3.6的
获取数据记录
fetchone, fetchmany,fetchall

上面的步骤完成了安装,下面就是用python来操作数据库

import MySQLdb

# 创建(返回)一个Connection 对象,代表了对数据库的一个连接,下面的一行代码就是连接数据库。connect连接返回的是一个Connection类型的对象。
connection = MySQLdb.connect(
                    host="ci.ytesting.com",    #数据库的ip地址   下面几个都可以用变量
                     user="songqin",            #mysql用户名
                     passwd=songqin,             #mysql用户登录密码
                     db="plesson",                 #数据库名
                     charset = "utf8")   #如果数据库里面的文本是utf-8编码的,charset指定是utf-8。查看mysql编码  1.user 数据库名 (先指定数据库)  2.show variables like "character_set_database"

# 返回一个cursor对象,中文叫游标。作用:获取到被读取数据的上下文之类的
c = connection.cursor()

# 执行一个获取 sq_course 表中所有记录的 sql 语句
c.execute("SELECT * FROM sq_course")    #从sq_course表中查询所有的信息

#print(c.rowcount)    #调用.rowcount是知道一共返回多少行数据

用fetchall

rows = c.fetchall()     #fetchall就是获取所有的内容
print(row)
#结果返回的是元组。元组里面也是元组,元组里面是每个具体的信息(见图1)

在这里插入图片描述

用fetchone

rows = c.fetchone()     #fetchone获取的是第一行的内容。如果下次再调用,就是获取第二行的数据   通过c.rowcount知道返回多少行了,可以用for循环把所有的数据打印出来
# for x in range(c.rowcount):
#     row = c.fetchone()
#     pprint.pprint(row)    #同样可以把数据都打印出来
print(row)
#结果返回的是元组。元组里面也是元组,元组里面是每个具体的信息(见图2)

在这里插入图片描述

用fetchmany

rows = c.fetchmany(c.rowcount)    #参数填想打印的行数c.rowcoun是一个参数,如:2
print(rows)   

数据多的时候fetchall获取所有数据的话,会影响效率
如何检查数据库里面试会否有一门课程是“python”

#方法一:
for row in rows:
    cname = row[1]
    if cname == "python"
        print("找到课程名为python")

#方法二:
c.execute("SELECT name FROM sq_course")    #从sq_course表中查询所有课程名的信息(见图三)
for row in rows:
    cname = row[0]
    if cname == "python"
        print("找到课程名为python")

在这里插入图片描述

#方法三:
c.execute("SELECT name FROM sq_course where name='python'")  (见图四)
pprint.pprint(c.rowcount)  
rows = c.fetchmany(c.rowcount)    #参数填想打印的行数
pprint.pprint(row)  
#判断有没有python的课程
if len(row) >0:
    print("OK")

在这里插入图片描述

插入数据(最常见的用途,为性能测试做准备)
先要把数据准备好,先写在一个数据文件里面,然后用程序把读出来

1.先试一下插一条数据

import MySQLdb

host = '192.168.0.107'  # 'ci.ytesting.com','192.168.0.105'
user="songqin"
passwd="songqin"
dbname="plesson"

connection = MySQLdb.connect(host=host,
                     user=user,
                     passwd=passwd,
                     db=dbname,
                     charset = "utf8")


c = connection.cursor()

# desc 是mysql 的关键字,所以要用反引号   id字段是自增型的,不需要写的   
c.execute("INSERT INTO sq_course ( name, `desc`, display_idx) VALUES ('法语','法语课',10)") 

# 一定要执行commit才能插入成功,对数据库的有修改的操作需要commit一下
connection.commit()

# c.rowcount 指明了这次插入记录的条数,查询的时候表示查询了多少行,插入的时候表示插入了多少行
print(c.rowcount)   

2.从文件里读出来,在写进去。这里验证的还是插一条#可以一次插多条,因为每一次都是网路数据过去的

import MySQLdb


host = '192.168.0.105'  # 'ci.ytesting.com','192.168.0.105'
user="songqin"
passwd="songqin"
dbname="plesson"


connection = MySQLdb.connect(host=host,
                     user=user,
                     passwd=passwd,
                     db=dbname,
                     charset = "utf8")

# 返回一个cursor对象
c = connection.cursor()


# 第一步:从数据文件中读出文件
with open('courses1.data',encoding='utf8') as f:     #courses1.data不在同一个目录,用绝对路径   如果不指定encoding='utf8',会使用py3中缺省的文件格式,会有乱码
    lines = f.read().splitlines()     #可以用readines(),会多个换行符;read().splitlines()把全部读出来,把换行符去掉了
    idx = 0
    for line in lines:
        # 如果不是空行
        if line :
            idx +=1 #加上后可以看插入的进度
            # 注意 desc 是mysql 的关键字,所以要用反引号
            c.execute(
                  f"""INSERT INTO sq_course ( name, `desc`, display_idx) VALUES ({line})"""    #巧的是这里的line的内容正好是name, `desc`, display_idx的这种格式
                   )

# 注意 一定要commit,否则添加数据不生效,注释掉给就不生效
connection.commit()
connection.close()

3.删除数据

import MySQLdb

host = '192.168.0.107'  # 'ci.ytesting.com','192.168.0.105'
user="songqin"
passwd="songqin"
dbname="plesson"

connection = MySQLdb.connect(host=host,
                     user=user,
                     passwd=passwd,
                     db=dbname,
                     charset = "utf8")

c = connection.cursor()

# 删除
c.execute("DELETE FROM sq_course WHERE name LIKE '测试课程%'")    #sql很多,也可以用id,DELETE FROM sq_course WHERE id >= 57


# 一定要执行commit才能删除成功
connection.commit()

# c.rowcount 指明了这次删除记录的条数
print(c.rowcount)

4.每次插入两条数据

import MySQLdb

host = '192.168.0.105'  # 'ci.ytesting.com','192.168.0.105'
user="songqin"
passwd="songqin"
dbname="plesson"

connection = MySQLdb.connect(host=host,
                     user=user,
                     passwd=passwd,
                     db=dbname,
                     charset = "utf8")

# 返回一个cursor对象
c = connection.cursor()

# 第一步:从数据文件中读出文件
with open('courses1.data',encoding='utf8') as f:     #courses1.data不在同一个目录,用绝对路径   如果不指定encoding='utf8',会使用py3中缺省的文件格式,会有乱码
    lines = f.read().splitlines()     #可以用readines(),会多个换行符;read().splitlines()把全部读出来,把换行符去掉了
    idx = 0
    for line in lines:
        # 如果不是空行
        if line :
            idx +=1 #加上后可以看插入的进度
            # 注意 desc 是mysql 的关键字,所以要用反引号
            c.execute(
                  """INSERT INTO sq_course ( name, `desc`, display_idx) VALUES
                    ("法语1","法语课1",10),
                    ("法语2","法语课2",10)""" )   #巧的是这里的line的内容正好是name, `desc`, display_idx的这种格式
                   )

# 注意 一定要commit,否则添加数据不生效,注释掉给就不生效
connection.commit()
connection.close()

5.每次插入100条数据 (python自己写算法)

import MySQLdb

host = '192.168.0.105'  # 'ci.ytesting.com','192.168.0.105'
user="songqin"
passwd="songqin"
dbname="plesson"

connection = MySQLdb.connect(host=host,
                     user=user,
                     passwd=passwd,
                     db=dbname,
                     charset = "utf8")

# 返回一个cursor对象
c = connection.cursor()

# 第一步:从数据文件中读出文件
with open('courses1.data',encoding='utf8') as f:     #courses1.data不在同一个目录,用绝对路径   如果不指定encoding='utf8',会使用py3中缺省的文件格式,会有乱码
    lines = f.read().splitlines()     #可以用readines(),会多个换行符;read().splitlines()把全部读出来,把换行符去掉了
    idx = 0
    addbatch = ""
    for line in lines:
    
        if idx % 10 == 0       #用%除,表示能除尽
            if addatch:
                c.execute(addatch)
            
            addbatch = "INSERT INTO sq_course ( name, `desc`, display_idx) VALUES (%s)" %line    #重新赋值
        else:
            addbatch +=",(%s)" %line   
        idx += 1
        print(idx)   #可以打印出来看进度
        
        
    c.execute(addatch)     #最后余的几个        
# 注意 一定要commit,否则添加数据不生效,注释掉给就不生效
connection.commit()
connection.close()
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐