python 操作数据库
python 操作数据库测试需要用例检查点用例数据准备手工测试:使用工具自动化测试:编程语言访问数据库原理:应用程序(包括应用app,驱动Driver就是客户端库)发送请求,发送程序给数据库服务进程(Server process)数据库:是存储数据的逻辑的集合。安装mysql(在Linux上)安装虚拟机,虚拟机中安装Linux请大家自行百度搜索,安装虚拟机管理器 virtua...
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()
更多推荐
所有评论(0)