下面介绍在写后端程序时遇到的问题。
后端我使用的是flask,有关flask的基本使用(请求和websocket)在第三篇文章中已经介绍过了,下面介绍一些问题及解决办法。
pymysql.err.InternalError: Packet sequence number wrong - got 1 expected 2
这里要注意,在将后端部署时有可能会报pymysql.err.InternalError: Packet sequence number wrong - got 1 expected 2
错误,导致部署后无法正常应用,果然开发环境和线上环境完全不一样。。。但是单独访问其中某一个请求是可以的,整个页面就不行,这是因为相当于多线程去访问数据库了,参照别人的博客我成功的有这一种方法:
在每个接口里单独定义数据库连接和游标,如:
@app.route('/testGet',methods=['get'])
def get_data():
# 开始mysql数据库连接
db = pymysql.connect(
host='***',
user='***',
password='***',
database='***'
)
# 使用cursor()方法创建一个游标对象
cursor = db.cursor()
db.commit()
searchSql='select * from countrydata'
cursor.execute(searchSql)
cursor.close()
db.close()
return json.dumps(dataList)
这样就没啥问题了,redis可以全局连接。
pymysql
pymysql挺好用的,我这里以常见的增删改查来说明
增
插入单个值的时候可以像下面这种形式:
cursor=db.cursor()
db.commit()# 注意在执行操作时,最好先commit一下
insertSql="insert into log (ip,user,time,method,url,protocol,code,size,link,result,resultDes,trueIP,message,rfc931) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
insertValue=(extractData['remote_addr'],extractData['user'],extractData['datetime'],extractData['request']['method'],extractData['request']['url'],extractData['request']['protocol'],extractData['status'],extractData['size'],
extractData['link'],eval(res.text)[0]['res'],'-','-',extractData['user_agent'],'-')
try:
cursor.execute(insertSql,insertValue)
db.commit()
except:
db.rollback()
print("出错!")
cursor.close()
插入多条数据的时候使用cursor.executemany(sql,data)
data为list形式,里面的单条数据是tuple形式。
删
deleteSql='delete from log where id="%s"'%(logID)
执行时与插入相同,这里需要注意的是删除一条数据时,主键已经不连续了,此时最好进行重新排序,做法如下:
alterSql1='alter table log drop id'#先删除主键列
alterSql2='alter table log add id int(11) primary key not null auto_increment first'#后重新按序添加
改
alter见上,update如updateSql='update log set result = "%s" , resultDes="%s" where id="%s"'%(logResult,description,logID)
注意这里多字段间用,
,不要和select弄混了用了and
查
select如searchSql='select count(*) from log where result="%s" and ip="%s"'%(yichang,ip)
在这里介绍一个我学会的一个比较高级的sql语句:
searchSql='select time,count(case when (result="%s") then result end) as zhCount,count(case when (result="%s") then result end) as yiCount from log where ip="%s" group by time'%(zhengchang,yichang,ip)
这个语句用到了case,这样就可以同时统计正常访问量和异常访问量了,非常方便。
select执行完成后,想要取到执行的结果,可以用cursor.fetchall()
(取全部结果,返回多元组)或者cursor.fetchone()
(取单条数据,返回单元组),如果想要返回字典形式(包括字段名的话)可以这样定义游标cursor:
cursor = db.cursor(pymysql.cursors.DictCursor)
运行后无法访问localhost
之前在编写flask运行时,没有任何问题,但是有一天突然localhost无法访问(一直在加载),也就是说后端突然失联了,而且后端在运行后的图片为:
感觉第一行的内容和之前不一样了,我在这之前也没干啥特别的操作,运行了另一个flask程序和一个watchdog程序,可能和这俩程序有关,虽然上面说Debugger is active!
但是Debug感觉并没有启动,因为之前我在运行时修改程序,它会检测到我的改动然后重新加载,但是现在没有反应,我在网上也没有查到相关资料,并且我将后端移到虚拟机里是可以正常访问的,这就很神奇!差点儿要重装环境,但是我在将dehug去掉时,程序竟然可以正常执行了,这就和debug相关了,查看了一些博客,发现自己的pycharm的设置并不相同,缺少了关于flask设置,我意识到可能是因为我在该程序目录下写了其他程序,导致pycharm不再将本程序标为flask程序,目前猜测在这。