既然我们都已经会在cmd中操作数据库,那么为什么还要用python连接mysql呢?这里就涉及到接口自动化,因为我们做接口自动化避免不了需要连接数据库做一些数据库的查询,这些操作都是需要我们来连接数据库的
操作前提:
- 电脑上已装好mysql服务,并配置好相应环境
- 已有python环境,并装好相应的编译器(如pycharm)
- 打开cmd ,输入: pip install pymysql ,安装pymysql库
这些已经准备好后,查看是否存在数据库
打开cmd,连接mysql,查看自己有没有数据库:
show databases;
没有就创建一个名为start的数据库:
create database start;
打开pycharm编译器,开始封装数据库
先创建一个DB类,并写好初始化方法
class DB():
# cursorclass将返回结果呈字典显示 ,如果传了就应用,不传就为None
def __init__(self,host,user,password,database,cursorclass = None):
self.host = host # ip地址,本机就传localhost就可以
self.user = user # 账户名,如果你没有更改过,那就是root
self.password = password # 数据库密码
self.databases = database # 你具体要连接的哪一个数据库
self.cursorclass = cursorclass # 返回结果呈字典形式 {}
在DB类下创建连接数据库的方法
def connect(self): # 创建连接数据库方法
import pymysql
# 创建数据库连接
self.db = pymysql.connect(host = self.host,user = self.user,password =
self.password,database = self.databases,cursorclass = self.cursorclass)
#创建游标
self.cursor = self.db.cursor()
这里游标的创建是为了执行sql语句,如果sql语句执行失败,同样也是需要游标回滚,否则后续的执行都会超出我们的预期范围
封装关闭数据库及游标方法
def close(self): #关闭方法
self.cursor.close() # 关闭游标
self.db.close() # 关闭数据库
封装查询方法
def get_one(self,sql): # 返回一条符合条件的查询结果
result = 0
try:
self.connect()
self.cursor.execute(sql)
result = self.cursor.fetchone()
self.close()
except Exception as e:
print('select error',e)
return result
def get_all(self,sql): # 返回全部符合条件的查询结果
result = 0
try:
self.connect()
self.cursor.execute(sql)
result = self.cursor.fetchall()
self.close()
except Exception as e:
print("select error",e)
return result
创建主函数,插入语句、删除语句、更新语句都是通过它来执行
def __edit(self,sql): # 创建主函数
result = 1 #设置结果集,用于调用的时候做判断
try: #这里是使用的try语句来尝试进行操作
self.connect()
self.cursor.execute(sql)
self.db.commit() # 注意的是,如果是对数据库做了修改、删除、增加的操作,那么一定要commit提交,查询和创建表不需要提交
self.close()
except Exception as e: # 如果操作失败,报出操作异常,且游标进行回滚
print('error :',e)
result = 0
self.db.rollback()
return result
封装修改方法、删除方法、插入数据方法
def insert(self,sql):
# 插入语句 ,以下三个都是一样的,只是调用的时候,我们看起来更加清晰而已
return self.__edit(sql) # 通过主函数的处理,来去执行sql语句
def delete(self,sql): # 删除语句
return self.__edit(sql)
def update(self,sql): # 修改语句
return self.__edit(sql)
实际上都是一样的,这里命名不一样是为了我们在后续执行或者回看代码的时候,更快速的知道它是属于哪一种sql语句
结合起来,展示下完整的封装数据库代码,喜欢的小伙伴可以直接copy哦~~~
class DB():
def __init__(self,host,user,password,database,cursorclass = None):# cursorclass将返回结果呈字典显示 ,如果传了就应用,不传就为None
self.host = host # ip地址,本机就传localhost就可以
self.user = user # 账户名,如果你没有更改过,那就是root
self.password = password # 数据库密码
self.databases = database # 你具体要连接的哪一个数据库
self.cursorclass = cursorclass # 返回结果呈字典形式 {}
def connect(self): # 创建连接数据库方法
import pymysql
# 创建数据库连接
self.db = pymysql.connect(host = self.host,user = self.user,password =
self.password,database = self.databases,cursorclass = self.cursorclass)
#创建游标
self.cursor = self.db.cursor()
def get_one(self,sql): # 返回一条符合条件的查询结果
result = 0
try:
self.connect()
self.cursor.execute(sql)
result = self.cursor.fetchone()
self.close()
except Exception as e:
print('select error',e)
return result
def get_all(self,sql): # 返回全部符合条件的查询结果
result = 0
try:
self.connect()
self.cursor.execute(sql)
result = self.cursor.fetchall()
self.close()
except Exception as e:
print("select error",e)
return result
def __edit(self,sql): # 创建主函数
result = 1 #设置结果集,用于调用的时候做判断
try: #这里是使用的try语句来尝试进行操作
self.connect()
self.cursor.execute(sql)
self.db.commit() # 注意的是,如果是对数据库做了修改、删除、增加的操作,那么一定要commit提交,查询和创建表不需要提交
self.close()
except Exception as e: # 如果操作失败,报出操作异常,且游标进行回滚
print('error :',e)
result = 0
self.db.rollback()
return result
def insert(self,sql):
# 插入语句 ,以下三个都是一样的,只是调用的时候,我们看起来更加清晰而已
return self.__edit(sql) # 通过主函数的处理,来去执行sql语句
def delete(self,sql): # 删除语句
return self.__edit(sql)
def update(self,sql): # 修改语句
return self.__edit(sql)
def close(self): #关闭方法
self.cursor.close() # 关闭游标
self.db.close() # 关闭数据库
接下来演示下怎么调用,这个就比较简单了
from 数据库_dom1 import DB
import pymysql
#实例化数据库对象sor
sor = DB(host = 'localhost',user = 'root',password = '12345678',database='start',cursorclass=pymysql.cursors.DictCursor)
# 测试创建表
sql = 'create table student(id int auto_increment primary key,name varchar(50))'
res = sor.update(sql)
if res == 1:
# 如果结果集返回1,实际上我们在封装的时候它就是1,那么执行下面的操作
sql = 'show tables;'
re = sor.get_all(sql)
print(re)
# 如果返回为0,那么打印下失败了
else:
print('数据库操作失败')
# 插入语句
sql = 'insert into student(name) values("白嘉诚")'
res = sor.insert(sql)
if res ==1:
sql = 'select * from student'
re = sor.get_all(sql)
print(re)
else:
print("插入失败")
# 修改语句
sql = 'update student set name="马旭萌" where name="白嘉诚"'
res = sor.update(sql)
if res ==1:
sql = 'select * from student'
re = sor.get_all(sql)
print(re)
else:
print('修改失败')
#删除语句
sql = 'delete from student where name ="马旭萌"'
res = sor.delete(sql)
if res ==1:
sql = 'select * from student'
re = sor.get_all(sql)
print(re)
else:
print('删除失败')
上面的删、改、插入方法调用起来都是一样的,这种的是比较容易理解的
这种封装数据库的方法适用于较灵活sql语句使用,比如多表联查等,没有对sql语句进行详细的封装,但是用起来肯定要比正常引用敏捷一些