創新實訓——011

下面介紹在寫後端程序時遇到的問題。
後端我使用的是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程序,目前猜測在這。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章