文章目录
- 一、安装mysql
- 二、SQLyog可视化操作
- 三、python实现数据库单表类封装
- 1. config 文件——`config.py`
- 2. 封装类(model)——`model.py`
- 3. 测试文件——`test.py`
一、安装mysql
官网安装,或者Windows64位直接在我的资源里面上传了mysql,不是8(最新),但是使用足够了。介意者转官网下载!
安装之后记得在服务里面开启mysql的服务,开启之后皆可以用了,如果想要方便一点记得去配置一下全局路径。不详写了,不知道的搜搜或者评论交流。
二、SQLyog可视化操作
不想写sql语句的(不建议,该写的还是要写的),或者是为了方便看数据,可以下载SQLyog,还有其他的软件也可以,直接在github上找绿色版就可以下到,安装右手就会。
三、python实现数据库单表类封装
文件结构
1. config 文件——config.py
记录数据库的信息
# 数据库配置信息
HOST = "localhost"
USER = "root"
PASSWD = ""
DBNAME = "mydb"
PORT = 3306
2. 封装类(model)——model.py
实现单表的增删改查
import pymysql # pip install pymysql
from db import configclass Model:'''单表信息操作类'''tab_name = None # 表名link = None # 数据库连接对象cursor = None # 游标对象pk = "id" # 表的主键名fields = [] # 当前表的字段def __init__(self, table, config=config):'''构造函数,初始化表名,连接数据库'''try:self.tab_name = tableself.link = pymysql.connect(host=config.HOST, user=config.USER, password=config.PASSWD, db=config.DBNAME,charset="utf8")self.cursor = self.link.cursor(pymysql.cursors.DictCursor) # 不加该参数返回元组self.__getFields() #不需要自定义表字段except Exception as error:print("数据库连接异常:", error)def __getFields(self):'''加载当前表的字段信息,私有方法'''sql = "SHOW COLUMNS FROM %s" % (self.tab_name)self.cursor.execute(sql)dlist = self.cursor.fetchall()for v in dlist:self.fields.append(v['Field'])if v['Key'] == 'PRI':self.pk = v['Field']def findAll(self):'''获取当前表的所有信息,返回信息列表,没有信息的返回空表'''try:sql = "select * from %s" % (self.tab_name)print(sql)self.cursor.execute(sql)info_list = self.cursor.fetchall()return info_listexcept Exception as error:print("查询数据有异常:", error)def findOne(self, data_id):'''获取指定data_id的单条数据'''try:sql = "select * from %s where id = %d" % (self.tab_name, data_id)print(sql)self.cursor.execute(sql)info = self.cursor.fetchone()return infoexcept Exception as error:print("查询数据有异常:", error)def select(self, where=[], order=None, limit=None):'''带条件的信息查询'''try:sql = "select * from %s" % (self.tab_name)if isinstance(where, list) and len(where) > 0:sql += " where " + " and ".join(where)if order is not None:sql += " order by " + orderif limit is not None:sql += " limit " + str(limit)print(sql)self.cursor.execute(sql)info = self.cursor.fetchall()return infoexcept Exception as error:print(error)def save(self, data={}):'''添加数据方法,参数data为字典格式,key为表字段名,value为数值'''try:keys = []values = []if isinstance(data,dict):for k, v in data.items():if k in self.fields:keys.append(k)values.append(v)else:print("数据非字典格式!")raise Exception# insert into 表名 (字段链表)values (值列表)sql = "insert into %s(%s) values(%s)"%(self.tab_name,','.join(keys), ','.join(['%s']*len(values)))print(sql)# 与其他直接执行的不太一样,先使用占位符,之后将列表转换为元组作为参数传入sql与其中的key值一一对应self.cursor.execute(sql,tuple(values))self.link.commit()# 返回插入数据的键值return self.cursor.lastrowidexcept Exception as error:print("添加数据出现错误!!!")def update(self, data={}):'''修改数据方法,参数是字典格式,key为表字段名,value为数值,参数data中要有主键的值,为修改条件'''try:values = []if isinstance(data,dict):for k, v in data.items():if (k in self.fields) and (k != self.pk):values.append("%s = '%s'" %(k,v))else:print("数据非字典格式!")raise Exception# ','.join(values)会将所有的数值都用,连接起来sql = "update %s set %s where %s=%s "%(self.tab_name,','.join(values),self.pk,data['id'])print(sql)self.cursor.execute(sql)self.link.commit()# 返回插入数据的键值return self.cursor.rowcountexcept Exception as error:print("修改数据出现错误!!!")def delete(self, id=0):'''删除数据,参数id为删除的数据主键值'''try:sql = "delete from %s where %s='%s'"%(self.tab_name,self.pk,str(id))print(sql)# 与其他直接执行的不太一样,先使用占位符,之后将列表转换为元组作为参数传入sql与其中的key值一一对应self.cursor.execute(sql)self.link.commit()# 返回插入数据的键值return self.cursor.rowcountexcept Exception as error:print("SQL执行错误!!!")def __del__(self):'''析构关闭游标和数据库'''if self.cursor != None:self.cursor.close()if self.link != None:self.link.close()
3. 测试文件——test.py
# 测试
from db.model import Modelif __name__ == "__main__":m= Model('stu')print(m.fields)# 查看stu表中所有数据# all_info = m.findAll()# for i in all_info:# print(i)# 查看stu表中逐渐为8的数据# one_data = m.findOne(8)# print(one_data)# 查看stu表格中性别为w,年龄小于50,按照年龄递减排序后的前两个数据# select_info = m.select(where=["sex='w'","age<50"],order="age desc",limit='2')# for row in select_info:# print(row)# 更新主键(id)为12的数据name为qq14,年龄为30,sex为m,classid为python03# a = m.update({"name":"qq14","age":30,"sex":"m","classid":"python03","id":12})# 删除主键为7的数据# print(m.delete(7))# print(m)