py操作MySQL以及解決亂碼問題的記錄

寫在前面

做py操作MySQL的原因是自己做着玩的項目需要:wepy微信機器人:向好友推送爬取的公告,裏面涉及到保存用戶的信息,以前圖簡單,直接放入一個列表內,一旦想優化一下代碼,程序重啓,用戶信息就沒了。所以就想着寫個數據庫保存用戶的信息。以前也使用過一些語言操作MySQL:PHP、Java等。其實都一樣,所以py上手也很快。

py操作MySQL

注:本小節內容幾乎完全引用的此博客:python-入門教程(操作mysql數據庫),但是自己還是寫一寫

pymysql安裝

  1. cmd內直接pip install pymysql
  2. pyCharm內引入時Alt+Enter安裝易可

代碼示例

關於庫也沒啥好介紹的,直接上代碼,下面是增刪改查的示例,看了就知道庫的用法了。唯一不熟悉的可能就是SQL語句了,但這也跟python無關,想要找對應的SQL語句可以去對應百度一下,但下面幾條應該夠用了。

查詢操作

import pymysql  #導入 pymysql

#打開數據庫連接,原博客端口是3307
db= pymysql.connect(host="localhost",user="root",password="123456",db="test",port=3306)

# 使用cursor()方法獲取操作遊標
cur = db.cursor()

#1.查詢操作
# 編寫sql 查詢語句  user 對應我的表名
sql = "select * from user"
try:
    cur.execute(sql)     #執行sql語句

    results = cur.fetchall()    #獲取查詢的所有記錄
    print("id","name","password")
    #遍歷結果
    for row in results :
        id = row[0]
        name = row[1]
        password = row[2]
        print(id,name,password)
except Exception as e:
    raise e
finally:
    db.close()    #關閉連接

插入操作

注:我個人習慣,一般把id設置爲主鍵並且自動遞增,所以我的SQL語句裏面不會指定id。

import pymysql
#2.插入操作
db= pymysql.connect(host="localhost",user="root",password="123456",db="test",port=3306)

# 使用cursor()方法獲取操作遊標
cur = db.cursor()

sql_insert ="insert into user(id,username,password) values(4,'liu','1234')"

try:
    cur.execute(sql_insert)
    #提交,這句執行才能在數據庫內看到記錄
    db.commit()
except Exception as e:
    #錯誤回滾
    db.rollback() 
finally:
    db.close()

更新操作

更新操作
db= pymysql.connect(host="localhost",user="root",password="123456",db="test",port=3306)

# 使用cursor()方法獲取操作遊標
cur = db.cursor()

sql_update ="update user set username = '%s' where id = %d"

try:
    cur.execute(sql_update % ("xiongda",3))  #像sql語句傳遞參數
    #提交
    db.commit()
except Exception as e:
    #錯誤回滾
    db.rollback() 
finally:
    db.close()

刪除

import pymysql
#4.刪除操作
db= pymysql.connect(host="localhost",user="root",password="123456",db="test",port=3306)

# 使用cursor()方法獲取操作遊標
cur = db.cursor()

sql_delete ="delete from user where id = %d"

try:
    cur.execute(sql_delete % (3))  #像sql語句傳遞參數
    #提交
    db.commit()
except Exception as e:
    #錯誤回滾
    db.rollback() 
finally:
    db.close()

連接遠程數據庫

一開始直接把"localhost"改成服務器的IP,報錯了。

db= pymysql.connect(host="localhost",user="root",password="123456",db="test",port=3306)

可能的問題有兩個:
1.服務器防火牆攔截請求:先去服務器官網的控制檯設置安全組開放端口;這種情況有可能還是訪問不了,網上說還要去服務器上去設置防火牆的進、出站規則,我爲了省事,直接就把防火牆關了。
2.數據庫權限問題:數據庫默認設置是隻能"localhost"訪問的,可以打開數據庫“mysql”,打開數據表“user”查看用戶權限(如下)
在這裏插入圖片描述
解決方法也有多種,比如添加新的遠程的用戶。較簡單的方法就是把root用戶的host從"localhost"改爲"%",代表ALL,接受任意IP的請求。在命令行內執行操作:

mysql -u root -p 
//打開數據庫“mysql”
mysql>use mysql;
//執行SQL語句,進行替換
mysql>update user set host = '%' where user = 'root';
//看下結果
mysql>select host, user from user;

這樣應該就沒問題了。

記錄: 亂碼問題解決!!!

起因(廢話請跳過):

白天代碼要爬公告不敢停,專門抽晚上的時間升級代碼。整個代碼寫好並且在電腦上調試好,大概4點了,心滿意足的準備部署到服務器睡覺。嘿嘿,服務器上調試的時候,突然出現了下圖這樣一條數據(id+用戶名):中文亂碼!而且這個用戶已經在數據庫內了(因爲中文亂碼,用戶重複了),人傻了。
在這裏插入圖片描述
然後去網上找解決方法,幾乎都找遍了,都沒用!一直調到了早上7點半,還是沒解決。10點要上班,就把先前的用戶信息寫到一個固定的列表內,寫了一個低配版本的腳本,白天先運行。趕緊睡了兩小時,好在當天晚上最終解決了問題。
我的問題總結:

  1. 服務器MySQL編碼有問題
  2. 服務器navicat編碼有問題

亂碼的來源

先歸納,亂碼的來源就三個地方:

  1. 代碼內提交數據編碼問題
  2. 數據庫編碼
  3. navicat編碼問題!!

1.代碼內的編碼問題
可以參考下面兩篇博客:(我沒有這個問題)
Python讀取mysql數據庫數據出現中文亂碼
(衝突)Python中使用pymysql插入中文數據問題
2.數據庫編碼問題
我最開始檢查了我服務器mysql的編碼,確實有問題。MySQL的默認編碼並不是utf-8。
可以看下面這篇博客:
mysql字符編碼的設置以及mysql中文亂碼的解決方法
還有個簡單暴力的方法是直接刪了重裝:附一個菜鳥教程的安裝教程。重裝還是比較快的:
MySQL安裝
3.navicat編碼問題
其實網上基本上是對前兩個問題的解答,我幾乎所有操作都搞了好幾遍,數據庫也刪了重裝了n次,服務器的navicat內還是幾個???。最後我乾脆控制變量,一個個試,用了本地的程序,本地的navicat,只有MySQL用的是服務器的,結果發現:沒有問題!!!。然後我分別用服務器的navicat和本地的navicat連接MySQL,發現效果如下:
在這裏插入圖片描述
所以此時其實代碼和數據庫都是沒問題的,其實只是navicat顯示的問題,完全不影響業務。(暴風哭泣.jpg)
那麼怎麼解決這個顯示問題呢?
在navicat連接屬性內=>高級=>編碼,選擇“自動”即可。
在這裏插入圖片描述

寫在後面

記錄學習,歡迎交流,多多指教

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