安裝pymysql模組
python操作mysql需要安裝pymysql模組:
pip install pymysql
連線資料庫
建議使用with這種方式,有兩條好處:一是可以不用另外寫close語句關閉連線,二是在異常退出時也能保證關閉連線。
題外話,python非常強調簡潔和一致性,檔案開啟、關閉;socket連線、關閉;mysql連線、關閉等等都建議使用with。
import pymysqlwith pymysql.connect(host='mysql的ip', user='你的使用者名稱', password='你的密碼', database='day5')\ as conn, conn.cursor() as cur: # 連線資料庫的物件名字是conn;連線資料庫的遊標物件名字是cur。
查詢使用execute方法執行SQL語句:
cur.execute('select * from score')
獲取查詢結果全部內容。注意這種方式非常佔記憶體,一般不使用這種方式:
ret = cur.fetchall() # 返回結果是元組,fetchall方法返回所有記錄print(ret)
獲取查詢結果,逐條處理。推薦使用這種方式:
for i in range(cur.rowcount): # rowcount是查詢結果的記錄數量 print(cur.fetchone()) # fetchone方法返回一條記錄
獲取查詢結果,指定返回記錄數:
ret = cur.fetchmany(50) # 返回50條記錄print(ret)ret = cur.fetchmany(50) # 返回剩下50條記錄print(ret)
增刪改
使用execute方法執行SQL語句,注意增刪改涉及到修改資料,execute方法執行完畢後還要執行commit方法提交後才會真正生效:
cur.execute('insert into student values (17,"男","熊大")')conn.commit()
注意,改動資料庫可能會遇到報錯的情況,上述程式碼並不完整。通常完整的結構如下:
try: cur.execute('insert into student values (17,"男","熊大")') conn.commit() # 提交改動資料的操作except Exception as e: print(e) # 遇到報錯時列印報錯資訊或寫入日誌檔案 conn.rollback() # 上述改動資料的操作遇到報錯時執行回滾
防注入
關於防SQL語句注入要先看案例再來說明:
假設有一個應用,登入時需要使用者提供使用者名稱和密碼。Python程式收到使用者輸入的使用者名稱和密碼後再提交到MySQL資料庫進行比對,若使用者名稱和密碼正確則允許登入,錯誤則拒絕登入。
一、建立測試用的庫和表:create database test_login;use test_login;create table login(name char(12),password char(12));insert into login values('張三','123456');
二、未防範SQL注入的錯誤程式碼案例:
import pymysqlwith pymysql.connect(host='127.0.0.1', user='你的賬戶', password='你的密碼', database='test_login') \ as conn, conn.cursor() as cur: usr = input('請輸入使用者名稱:') pwd = input('請輸入密碼:') condition = f'select * from login where name="{usr}" and password="{pwd}"' print(condition) cur.execute(condition) if cur.rowcount: print('登入成功') else: print('登入失敗')
三、測試SQL注入,在輸使用者名稱時輸入 1" or 1=1; #,請看下圖:請認真看上面列印的sql語句內容:請認真看上面列印的sql語句內容:
select * from login where name="1" or 1=1; #" and password="1"
請注意sql語句中#表示註釋後面的全部內容,所以MySQL服務端真正執行的語句如下:
select * from login where name="1" or 1=1;
看到這相信大家都能明白為啥無論密碼輸入什麼都能登入成功,以上就是著名的SQL注入。上面的案例僅僅是示範如何繞過安全驗證,實際上透過SQL注入甚至可以刪庫、刪表造成整個系統崩潰。所以我們寫程式碼時必須要防範SQL注入!
四、防範SQL注入的正確程式碼:import pymysqlwith pymysql.connect(host='127.0.0.1', user='你的賬戶', password='你的密碼', database='test_login') \ as conn, conn.cursor() as cur: usr = input('請輸入使用者名稱:') pwd = input('請輸入密碼:') condition = 'select * from login where name="%s" and password="%s"' print(condition) cur.execute(condition, (usr, pwd)) # execute方法有2個引數,第一個是SQL語句,第二個是元組(元組的成員是多個引數) if cur.rowcount: print('登入成功') else: print('登入失敗')
五、測試SQL注入此時可以看到SQL注入不會失效,請牢記execute防範SQL注入的正確方法!!!寫程式碼務必不要出現可以SQL注入的巨大漏洞!!!
補充一條:可以在使用者輸入使用者名稱和密碼時進行檢測,不允許使用者名稱和密碼中出現;和#這2個符號。這樣也可以有效地防範SQL注入!