常見MySQL操作
所需模塊:
1 pip3 install pymysql
查詢(fetchone,fetchmany,fetchall):
1.fetchone
1 import pymysql 2 3 con = pymysql.connect(host="localhost", user="root", password="admin", database="pysql", charset="utf8") 4 cursor = con.cursor() 5 try: 6 # 當id設置為主鍵,但是沒有設置為自增時,則必須給id字段賦值,否則會報錯。 7 sql = "select * from userinfo;" 8 cursor.execute(sql) 9 # 單使用一個fetchone會獲取索引為0的記錄,若使用多個fetchone時,會按照前一個的索引值繼續向下獲取記錄 10 data1 = cursor.fetchone() 11 data2 = cursor.fetchone() 12 data3 = cursor.fetchone() 13 except Exception as e: 14 print("error") 15 cursor.close() 16 con.close() 17 print(data1) 18 print(data2) 19 print(data3)
2.fetchmany
1 import pymysql 2 3 con = pymysql.connect(host="localhost", user="root", password="admin", database="pysql", charset="utf8") 4 cursor = con.cursor() 5 try: 6 # 當id設置為主鍵,但是沒有設置為自增時,則必須給id字段賦值,否則會報錯。 7 sql = "select * from userinfo;" 8 cursor.execute(sql) 9 # 和fetchone相同:單個從0開始獲取查詢,多個從上一個的索引之后進行查詢 10 data1 = cursor.fetchmany(3) 11 data2 = cursor.fetchmany(5) 12 except Exception as e: 13 print("error") 14 cursor.close() 15 con.close() 16 print(data1) 17 print(data2)
3.fetchall
1 import pymysql 2 3 con = pymysql.connect(host="localhost", user="root", password="admin", database="pysql", charset="utf8") 4 cursor = con.cursor() 5 try: 6 # 當id設置為主鍵,但是沒有設置為自增時,則必須給id字段賦值,否則會報錯。 7 sql = "select * from userinfo;" 8 cursor.execute(sql) 9 # 單使用一個fetchmany會獲取所有記錄,若使用多個fetchone時,其余的fetchall()結果為空 10 data1 = cursor.fetchall() 11 data2 = cursor.fetchall() 12 except Exception as e: 13 print("error") 14 cursor.close() 15 con.close() 16 print(data1) 17 print(data2)
插入、更新、修改(最后需要提交)
1 import pymysql 2 conn=pymysql.connect(host='localhost',user='root',password='admin',database='db1') 3 cursor=conn.cursor() 4 sql='insert into user(name,password) values("xxx","123");' 5 rows=cursor.execute(sql) 6 print(cursor.lastrowid) #在插入語句后查看最新一條記錄id 7 # pymysql.connect 類默認開啟了事務,因此對表進行修改、更新、刪除、插入操作時需要提交事務才可以生效 8 conn.commit() 9 cursor.close() 10 conn.close()
SQL注入
名詞解釋:
SQL注入是對Python與MySQL進行動態數據校驗時,用戶故意輸入非法字段,從而繞過數據校驗的行為。
1 import pymysql 2 user=input('用戶名: ').strip() 3 pwd=input('密碼: ').strip() 4 5 #鏈接 6 conn=pymysql.connect(host='localhost',user='root',password='admin',database='db1',charset='utf8') 7 #游標 8 cursor=conn.cursor() #執行完畢返回的結果集默認以元組顯示 9 #執行sql語句 10 sql='select * from user where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引號 11 print(sql) 12 res=cursor.execute(sql) #執行sql語句,返回sql查詢成功的記錄數目 13 cursor.close() 14 conn.close() 15 16 if res: 17 print('登錄成功') 18 else: 19 print('登錄失敗')
正常情況下的輸入過程:
故意繞過驗證的非法輸入
當知道用戶名時:
雖然知道密碼,但輸入的密碼不匹配卻成功登陸。
用戶名和密碼都不知道時:
雖然不知道用戶名和密碼,卻成功登陸。
SQL注入的中心思想就是人為的輸入SQL語句中的特殊字符串,繞過驗證。"--"在MySQL中為注釋字符,通過此方法可以屏蔽部分代碼,從而繞過驗證。
解決辦法:
使用MySQL的內置方法校驗輸入字符串的合法性,提高安全性。
1 import pymysql 2 user=input('用戶名: ').strip() 3 pwd=input('密碼: ').strip() 4 5 #鏈接 6 conn=pymysql.connect(host='localhost',user='root',password='admin',database='db1',charset='utf8') 7 #游標 8 cursor=conn.cursor() #執行完畢返回的結果集默認以元組顯示 9 #執行sql語句 10 sql='select * from user where name=%s and password=%s'#注意%s沒有加引號 11 print(sql) 12 res=cursor.execute(sql,[user,pwd]) #執行sql語句,返回sql查詢成功的記錄數目 13 cursor.close() 14 conn.close() 15 if res: 16 print('登錄成功') 17 else: 18 print('登錄失敗')
校驗驗證:
成功解決SQL注入問題。