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)