python连接数据库:pymsql模块--增删查改操作类化

dbDemon项目目录结构:

__init__.py初始化文件 #一个模块必须要的文件
config.py 配置文件
model.py  具体实现操作的文件
dbDemonTest.py  测试db模块的文件

config.py 配置文件

#定义数据库信息
host='localhost'
user='root'
password=''
dbname='mydb'
port=3306

model.py 具体实现操作的文件

import pymysql,os,sys
from dbDemon import config

class Model:
    link=""
    cursor=""
    primarykey='id'
    table=''
    field=[]  #定义表格字段

    def __init__(self,tablename,config=config):  #config默认使用以及定义好的py文件,如果初始化时自动传入也可以
        try:
            self.link=pymysql.connect(host=config.host,user=config.user,password=config.password,port=config.port,db=config.dbname)
            self.cursor=self.link.cursor()  #返回一个cursor游标对象
            #self.cursor=self.link.cursor(pymysql.cursors.DictCursor)  #返回的是字典格式的cursor对象

            self.table=tablename
            self.__loadfield()
        except Exception:
            print("初始化model类失败:%s"%Exception)

    def __del__(self):   ####定义析构函数,结束调用时自动关闭
        if self.cursor:
            self.cursor.close()
        if self.link:
            self.link.close()

    def findAll(self):
        try:
            sql='select * from %s' % self.table
            print('执行:'+sql)
            self.cursor.execute(sql)
            data=self.cursor.fetchall()
            print('当前表格有%s条数据' % self.cursor.rowcount + "\n" + "已有数据为:")
            #print(data)

            return  data
        except Exception:
            print('sql 查询所有数据失败')
    def findone(self,id=0):
        try:
            sql='select * from %s where %s="%s"' % (self.table,self.primarykey,id)
            print('执行:'+sql)
            self.cursor.execute(sql)
            data=self.cursor.fetchall()
            print('当前表格有%s条数据'%self.cursor.rowcount+"\n"+"已有数据为:")
            print(data)
        except Exception:
            print('sql 查询所有数据失败')

    def select(self,where=[],order='',limit=''):
        try:
            sql = 'select * from %s ' %self.table
            if isinstance(where,list) and len(where)>0:#判断输入的条件为list格式且不为空
                wheres=' and ' .join(where)
                print('查询满足条件:%s的数据'%wheres)
                sql=sql+' where %s' % wheres
            if order:
                sql=sql+" order by "+order
            if limit:
                sql=sql+' limit '+limit
            print('执行:' + sql)
            self.cursor.execute(sql)
            data = self.cursor.fetchall()
            print(data)
        except Exception:
            print('条件错误!')

    def save(self,data={}):  #增加方法 写入数据库 字典中key为数据库字段,value为值
        try:
            print(data)
            keys=[]
            values=[]
            for key,value in data.items():
                keys.append(key)
                print(keys)
                values.append(value)
                print(values)
            #print('写入的字段为%s,数据为%S'%(keys,values))
            #print(','.join(values))
            #sql = 'insert into %s(%s) values(%s)' % (self.table,','.join(keys),','.join(values))  报错  因为values里面有str和int型
            sql = 'insert into %s(%s) values(%s)' % (self.table, ','.join(keys), ','.join(['%s']*len(values)))  #valuse是放的占位符%s,执行时才传入
            #['%s']  必须用中括号
            print(sql)
            self.cursor.execute(sql,tuple(values))
            self.link.commit()
            print(self.cursor.lastrowid)
            self.findAll()
        except Exception as err:
            print('写入失败 %s' %err)

    def updata(self,data={}):  #增加方法 写入数据库 字典中key为数据库字段,value为值
        try:
            print(data)
            values=[]
            for key,value in data.items():
                if key != self.primarykey:
                    #values.append(key+'='+value)  #这种写法不能自动转换int为str类型
                    values.append("%s='%s'"%(key,value))
                    print(values)
            sql = 'update %s set %s where %s =%s ' % (self.table,','.join(values),self.primarykey,data.get('id'))  #valuse是放的占位符%s,执行时才传入
            #['%s']  必须用中括号
            print(sql)
            self.cursor.execute(sql)
            self.link.commit()
            print(self.cursor.lastrowid)
            self.findAll()
        except Exception as err:
            print('写入失败 %s' %err)

    def delete(self,id=0):
        try:
            sql='delete from %s where %s = "%s" ' % (self.table,self.primarykey,id)
            print(sql)
            self.cursor.execute(sql)
            self.link.commit()
            self.findAll()
        except Exception as err:
            print('删除失败 %s' % err)
    def __loadfield(self):#根据表格名获取他的字段和主键  这个是内部私有方法 不能外部调用
        try:
            sql="desc %s" % self.table
            self.cursor.execute(sql)
            data=self.cursor.fetchall()
            #print(data)
            for v in data:
               # print(v)
                #if v["Key"] == "PRI":
                #    self.primarykey=v["Key"]
                if "PRI" in v:
                    self.primarykey=v[0]
                    #print(self.primarykey)
                self.field.append(v[0])
            print("当前表格主键为:")
            print(self.field)
        except Exception as err:
            print('获取字段失败 %s' % err)

dbDemonTest.py 测试db模块的文件(第一个测试文件)

from dbDemon.model import Model  #导入dbdemone目录下的model文件内的Model类
import os,sys
if __name__=="__main__":
    test=Model('mytable')
    #test.findAll()
    #test.findone(4)
    print("欢迎来到mytable表格进行查询")
    #{0:<5}表示第1个位置 占位5个;
    print("|{0:<12} |{1:<12} |{2:<12} |{3:<10}".format('1.查询所有数据','2.查询单个数据','3.插入数据','4.删除数据'))
    while True:
        type=input("输入你要进行的操作:")
        if type == '1':
            print("开始查询所有数据")
            data=test.findAll()
            print("|{0:<5} |{1:<5} |{2:<5} |{3:<5}".format('id', 'name', 'class', 'age'))
            for da in data:
                print("|{0:<5} |{1:<5} |{2:<5} |{3:<5}".format(da[0], da[1], da[2], da[3]))
        elif type =='2':
            ids=input("请输入要查询的人员id号:")
            test.findone(int(ids))
        elif type =='3':
            name=input("请输入创建的人员名称")
            id=input("请输入创建的id")
            classic=input("请输入班级")
            age=input("请输入年龄")
            test.save({'id': id, 'name': name, 'class': classic, 'age': age})  # 增加数据
        elif type =='4':
            id=input("请输入需要删除的人员的id值")
            test.delete(id)
        else:
            print("输入错误!!退出")
            break


    #lists=['id=7','name="newname"']
    lists=['name="newname"']
    #test.select(lists,'id desc','2')
    #test.save({'id':11,'name':'addn2','class':'shell1','age':18}) #增加数据
    #test.updata({'id':11,'name':'updatename','class':'shell','age':18})
    #test.delete(10)

和shell交互操作格式化输出内容(第二个测试文件)

from dbDemon.model import Model  #导入dbdemone目录下的model文件内的Model类
import os,sys
if __name__=="__main__":
    test=Model('mytable')
    #test.findAll()
    #test.findone(4)
    print("欢迎来到mytable表格进行查询")
    #{0:<5}表示第1个位置 占位5个;
    print("|{0:<12} |{1:<12} |{2:<12} |{3:<10}".format('1.查询所有数据','2.查询单个数据','3.插入数据','4.删除数据'))
    while True:
        type=input("输入你要进行的操作:")
        if type == '1':
            print("开始查询所有数据")
            data=test.findAll()
            print("|{0:<5} |{1:<5} |{2:<5} |{3:<5}".format('id', 'name', 'class', 'age'))
            for da in data:
                print("|{0:<5} |{1:<5} |{2:<5} |{3:<5}".format(da[0], da[1], da[2], da[3]))
        elif type =='2':
            ids=input("请输入要查询的人员id号:")
            test.findone(int(ids))
        elif type =='3':
            name=input("请输入创建的人员名称")
            id=input("请输入创建的id")
            classic=input("请输入班级")
            age=input("请输入年龄")
            test.save({'id': id, 'name': name, 'class': classic, 'age': age})  # 增加数据
        elif type =='4':
            id=input("请输入需要删除的人员的id值")
            test.delete(id)
        else:
            print("输入错误!!退出")
            break


    #lists=['id=7','name="newname"']
    lists=['name="newname"']
    #test.select(lists,'id desc','2')
    #test.save({'id':11,'name':'addn2','class':'shell1','age':18}) #增加数据
    #test.updata({'id':11,'name':'updatename','class':'shell','age':18})
    #test.delete(10)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值