一、MySQL操作补充
cur = coon.cursor(cursor=pymysql.cursors.DictCursor)
建立游标的时候指定了游标类型,返回的就是一个字典了。
fetchall() #获取到这个sql执行的全部结果,它把数据库表里面的每一行数据放到一个list里面
[ ['1','2','3'] ] [{},{},{}]
fetchone() #获取到这个sql执行的一条结果,它返回就只是一条数据
如果sql语句执行的结果是多条数据的时候,那就用fetchall()
如果你能确定sql执行的结果就只有一条,那么就用fetchone()
enumerate([list,list2]) #循环的时候,直接获取到下标,和值
for index,value in enumerate([list,list2]):#list2里面是什么?
print(index,vlaue)
fileds = ['id','name','sex','addr','gold','score'] for index,filed in enumerate(fileds): print(index,filed)
运行结果:
0 id 1 name 2 sex 3 addr 4 gold 5 score
一个返回数据库表头字段的函数:
import pymysql def my_db(sql,port=3306,charset='utf8'): import pymysql host, user, passwd, db = '118.24.3.40','jxz','123456','jxz' coon = pymysql.connect(user=user,host=host,port=port,passwd=passwd,db=db,charset=charset) cur = coon.cursor(cursor=pymysql.cursors.DictCursor) #建立游标,指定cursor类型返回的是字典 cur.execute(sql)#执行sql if sql.strip()[:6].upper()=='SELECT': # res = cur.fetchall() fileds = [] # for filed in cur.description:#cur.description可直接获取到建表时的字段描述信息,如('id', 253, None, 40, 40, 0, True) # fileds.append(filed[0]) fileds = [ filed[0] for filed in cur.description ] #和上面3行代码的意思是一样 print(fileds) # cur.fetchmany() #能传入一个数,返回多少条数据 res= 'xx' else: coon.commit() res = 'ok' cur.close() coon.close() return res res = my_db('select * from users_info limit 10;')#limit用于指定返回的数据条数 print(res)
运行结果:
['id', 'username', 'passwd'] xx
enumerate函数:同时获取到list的下表和值
fileds = ['id','name','sex','addr','gold','score'] for index,filed in enumerate(fileds): print(index,filed)
运行结果:
0 id 1 name 2 sex 3 addr 4 gold 5 score
练习:通用数据库导出到EXCEL函数
import pymysql,xlwt def export_excel(table_name): host, user, passwd, db = '118.24.3.40', 'jxz', '123456', 'jxz' coon = pymysql.connect(user=user, host=host, port=3306, passwd=passwd, db=db, charset='utf8') cur = coon.cursor() # 建立游标,指定cursor类型返回的是字典 sql = 'select * from %s ;'%table_name cur.execute(sql) # 执行sql fileds = [filed[0] for filed in cur.description] #所有的字段 all_data = cur.fetchall()#所有的数据 book = xlwt.Workbook() sheet= book.add_sheet('sheet1') for col,filed in enumerate(fileds): #写表头的 sheet.write(0,col,filed) row = 1 #行数 for data in all_data: #data为每一行数据 for col, filed in enumerate(data): # 控制列写入 sheet.write(row, col, filed) row+=1#每次写完一行,行就加1 book.save('%s.xls'%table_name) export_excel('app_student')
二、操作Excel
修改Excel:
import xlrd from xlutils import copy book = xlrd.open_workbook('app_student.xls') #先用xlrd模块,打开一个excel new_book = copy.copy(book) #通过xlutils这个模块里面copy方法,复制一份excel sheet = new_book.get_sheet(0) #获取sheet页 lis = ['编号','名字','性别','年龄','地址','班级','手机号','金币'] for col,filed in enumerate(lis): sheet.write(0,col,filed) new_book.save('app_student.xls')
读取Excel:
import xlrd book = xlrd.open_workbook('app_student.xls') sheet = book.sheet_by_index(0)#根据索引获取sheet页 # sheet2 = book.sheet_by_name('sheet1')#根据名称获取sheet页 print(sheet.cell(0,0).value) #指定sheet页里面第一行和第一列获取数据 print(sheet.cell(1,0).value) #指定sheet页里面第2行和第1列获取数据 print(sheet.row_values(0)) #获取到第1行的内容 print(sheet.row_values(1)) #获取到第2行的内容 print(sheet.nrows) #获取到excel里面总共有多少行 for i in range(sheet.nrows): #知道行数后,循环获取到每行数据 print(sheet.row_values(i)) print(sheet.ncols) #总共多少列 print(sheet.col_values(0)) #取第几列的数据
三、操作Redis
redis是一个nosql类型的数据库,数据都存在内存中,有很快的读写速度,python操作redis使用redis模块,pip安装即可
redis数据全部都是存在内存里面。
redis本身性能是非常好的,每秒支持30w次的读写。
import redis r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379)#连接redis #增删改查 r.set('niuhanyang','帅!') #数据库里面新增一个值 # hwt = r.get('niuhanyang')#查,根据key获取对应的值 # print(hwt.decode()) #修改也是set r.delete('niuhanyang') r.setex('python_123','哈哈哈',20) #设置key的失效时间,最后这个参数是秒,时间过后,即删掉这个KEY hwt = r.get('mei')#获取到的是二进制 为bytes类型 print(hwt.decode())#将bytes类型转换为字符串类型,encode将字符串转换为bytes print(hwt) print(r.keys('*xxx*'))#获取到所有含xxx的key print(r.keys())#获取到所有的KEY print(r.get('sdfsdf')) r.set('今天是2018年6月9日:mpp','呵呵呵')#Key中有的冒号的,冒号前面为文件夹的名称,同一个文件夹的内容都可以这样存入 r.set('今天是2018年6月9日:dict','今天是星期六') for k in r.keys(): #删除所有的key r.delete(k) # 上面操作都是针对 string类型 # 哈希类型 hash 类似嵌套字典 r.hset('stu_info','刘伟','1m8 100w存款') r.hset('stu_info','张流量','浪,为了不交作业,故意让狗咬他') r.hset('stu_info','董春光','为了不交作业,找了一条狗咬张流量,然后陪张流量去医院') # print(r.type('stu_info'))#查看key的类型 # print(r.hget('stu_info','张流量').decode()) #指定大key和小key获取对应的数据 # print(r.hgetall('stu_info')) #获取里面所有的k和-v stu_info = r.hgetall('stu_info')#获取到stu_info下的所有k-v print(stu_info) stu_dic={} for k,v in stu_info.items():#stu_info.items()获取到所有的k-v # print(k.decode(),v.decode()) stu_dic[k.decode()]=v.decode() print(stu_dic) r.hdel('stu_info','gyx') #删除指定key r.delete('stu_info') #删除整个key r.expire('aaa',100) #设置失效时间 print(r.type('stu_info')) #查看key是什么类型的 print(r.type('zll')) s='呵呵' s.encode() #把字符串转成二进制 hwt = b'sdfsdfsdf' hwt.decode() #把bytes类型转成字符串 #pymysql、json、redis #1、连数据库,查到数据库里面所有的数据,游标类型要用pymysql.curosrs.DictCour #2、查到所有数据 [ {"id":1,"passwd":"49487dd4f94008a6110275e48ad09448","username":"niuhayang","is_admin":1}] #3、循环这个list,取到usernamer,把username当做key #4、再把这个小字典转成json,存进去就ok import pymysql,json,redis r = redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379) conn = pymysql.connect(host='118.24.3.40',user='jxz',passwd='123456',db='jxz',charset='utf8') cur = conn.cursor(cursor=pymysql.cursors.DictCursor) cur.execute('select * from my_user;') all_data = cur.fetchall() for data in all_data: k = data.get('username') r.hset('stu_info_nhy',k,json.dumps(data)) cur.close() conn.close() #下面这个是我自己写的 import pymysql,redis,json r=redis.Redis(host='118.24.3.40',password='HK139bc&*',db=1,port=6379) coon=pymysql.connect(host='118.24.3.40',user='jxz',passwd='123456',db='jxz',charset='utf8') cur=coon.cursor(cursor=pymysql.cursors.DictCursor) cur.execute('select * from my_user;') res=cur.fetchall() for data in res: username=data.get('username') data_json=json.dumps(data)#此处代码可参考上面老师写的进行精简 r.hset('my_user',username,data_json) cur.close() coon.close()
四、接口开发
import flask,json #轻量级的web开发框架 #作为服务端,来开发接口供别人调用,需先启动一个服务 server=flask.Flask(__name__)#__name__代表当前这个python文件, # 这句代码的意思就是把咱们当前的python文件当做一个服务,下面要在这个服务上开发一个接口 #*******get请求可以在浏览器直接访问,post请求需通过第三方工具调用***** # ****操作数据库**** def my_db(sql): import pymysql coon = pymysql.connect( host='118.24.3.40', user='jxz', passwd='123456', port=3306, db='jxz', charset='utf8') cur = coon.cursor() #建立游标 cur.execute(sql)#执行sql if sql.strip()[:6].upper()=='SELECT': res = cur.fetchall() else: coon.commit() res = 'ok' cur.close() coon.close() return res # ****操作数据库****
# *******第一个接口******* #ip:8080/index?uge @server.route('/index',methods=['get','post'])#这句代码的意思是下面这个函数将作为服务里的一个接口, # 不再是一个普通的函数;调用这个接口时,就调用index这个路径,methonds为支持调用的方法, # 可以post或get,也可以都写,也可以不写,不写默认为get方法 def index(): res={'msg':'这是我开发的第一个接口','msd_code':0}#这是一个字典,下面调用时要转换成json串 return json.dumps(res,ensure_ascii=False) # server.run(port=7777,debug=True)#启动服务,可以指定端口号,不写时默认为5000,debug=True,改了代码之后,不用重启它会自动帮你重启 #这时就可以直接在浏览器访问这个接口:http://127.0.0.1:7777/index
# *******第一个接口*******
# *******注册用户接口******* @server.route('/reg',methods=['post'])#post请求不能直接在浏览器访问 def reg(): username=flask.request.values.get('username')#接收用户输入 pwd=flask.request.values.get('passwd')#接收用户输入 if username and pwd: sql='select * from my_user where username="%s";'%username #这里因为%s未加双引号导致sql执行失败,sql一定要写正确,切记切记 if my_db(sql): res={'msg':'用户已存在','msg_code':2001} else: insert_sql='insert into my_user (username,passwd,is_admin) values ("%s","%s",0);'%(username,pwd) my_db(insert_sql) res={'msg':'注册成功!','msg_code':0} else: res={'msg':'必填字段未填,请查看接口文档!','msg_code':1001}#1001 必填字段未填 return json.dumps(res,ensure_ascii=False)
# *******注册用户接口*******
server.run(port=7777,debug=True,host='0.0.0.0')#启动服务,可以指定端口号,不写时默认为5000,debug=True,改了代码之后,不用重启它会自动帮你重启 #在postman中输入参数调用该注册接口,可正确返回结果
浏览器调用结果:
postman调用注册接口执行情况:
注册成功:
用户已存在:
五、项目开发文件逻辑
单独的一个python文件不叫程序,叫脚本;复杂的程序通常都会分目录存储,方便修改和查阅,提高代码的可读性。例如:bin目录下放置启动文件,启动程序时直接执行该目录下的文件即可;config目录下放置配置文件,主要是一些端口或IP地址等;lib目录下放置接口文件及自己开发的一些工具程序;log下存放日志;data下放置初始化数据等;还应包含readme文件。
下面PS一片Linux下的目录层级说明: