Python開發---操作MySQL資料庫,pythonmysql

來源:互聯網
上載者:User

Python開發---操作MySQL資料庫,pythonmysql

部落格核心內容:

參考部落格:https://www.cnblogs.com/anpengapple/p/7127580.html
1.初試操作
2.使用者初次登陸MySQL資料庫的驗證以及由此引發SQL注入的問題
3.如何解決MySQL的注入問題
4.pymysql模組對資料庫進行增刪改查操作
5.通過pymysql擷取新增資料的自增ID:通過lastrowid這個方法
6.fetch資料類型的擷取

(一)pymysql模組初步操作MySQL資料庫
pymysql是Python中操作MySQL的模組,其使用方法和MySQLdb幾乎相同。
python操作MySQL的原理:通過Socket用戶端串連MySQL的服務端,串連之後發送SQL語句,最後關閉串連。
程式碼範例:

#!/usr/bin/python# -*- coding:utf-8 -*-import pymysql#通過Socket的用戶端串連MySQL的服務端,建立相應的串連conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",database="Test_mine1",charset='utf8')#建立遊標cursor_oper = conn.cursor()"""建立完遊標cursor之後便可以對資料庫MySQL進行相應的操作,注意:遊標內建移動特性遊標每移動一次,便擷取下一條資料"""#執行SQL,並返回受影響的行數v1 = cursor_oper.execute('select * from student')print("student表中資料的行數是:%d"%v1)#通過遊標中的fetch方法擷取資料庫中的資料result1 = cursor_oper.fetchall()print(result1)#執行SQL,並返回受影響的行數v2 = cursor_oper.execute('select * from student where name = "lidong" ')print("%d"%v2)result2 = cursor_oper.fetchone()print(result2)#執行SQL,並返回受影響的行數v3 = cursor_oper.execute('select * from student where id >= 2')print("%d"%v3)result3 = cursor_oper.fetchmany(1)print(result3)#關閉遊標和連結cursor_oper.close()conn.close()

運行結果:

student表中資料的行數是:4((1, 'zhangsan', 'nan'), (2, 'lidong', 'nan'), (3, 'wangting', 'nv'), (4, '張明', 'nan'))1(2, 'lidong', 'nan')3((2, 'lidong', 'nan'),)

(二)使用者初次登陸MySQL資料庫的驗證以及由此引發SQL注入的問題
相關知識點:

使用者登入:socket連結資料庫,並進行SQL語句的定製基於資料庫的登入驗證SQL注入問題的原因:如果通過字串格式化去拼接SQL語句,將會帶來SQL注入的問題。SQL注入問題的解決措施:pymysql已經幫我們解決這個問題了,所以我們就不要在通過字串格式化去拼接SQL語句了,在%s兩邊不要加引號了,參數在execute的第二個參數傳值,而不要進行格式化了cursor_oper.execute(sql,[user,pass_wd])這個時候有點讓我想起了C語言中的處理方案.

對比圖:

樣本程式:初步登陸驗證程式

#!/usr/bin/python# -*- coding:utf-8 -*-"""使用者登入:socket連結資料庫,並進行SQL語句的定製基於資料庫的登入驗證SQL注入問題的原因:如果通過字串格式化去拼接SQL語句,將會帶來SQL注入的問題。SQL注入問題的解決措施:pymysql已經幫我們解決這個問題了,所以我們就不要在通過字串格式化去拼接SQL語句了,在%s兩邊不要加引號了,參數在execute的第二個參數傳值,而不要進行格式化了cursor_oper.execute(sql,[user,pass_wd])這個時候有點讓我想起了C語言中的處理方案."""import pymysqluser = input("請輸入使用者名稱:")pass_wd = input("請輸入密碼:")#使用者驗證之前與資料庫建立串連conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor()"""用戶端與資料庫建立連結之後,便可以進行相應的操作,注意:SQL語句中相應的欄位要加引號"""sql = """      select *      from userinfo      where username = '%s' and pass_wd = '%s'      """%(user,pass_wd)print(sql)v1 = cursor_oper.execute(sql)print(v1)result = cursor_oper.fetchall()print(result)cursor_oper.close()conn.close()

運行結果1樣本:

請輸入使用者名稱:alex請輸入密碼:841807      select *      from userinfo      where username = 'alex' and pass_wd = '841807'1((1, 'alex', '841807'),)

運行結果2樣本:(SQL注入的問題)

(三)如何解決MySQL的注入問題
原因:SQL注入問題的原因:如果通過字串格式化去拼接SQL語句,將會帶來SQL注入的問題。
方法:不通過字串格式化去拼接SQL語句,並在cursor_oper.execute(sql,[user,pass_wd])中傳入第二個參數。

cursor_oper.execute(sql,[user,pass_wd])

樣本程式:MySQL注入問題的解決方案

#!/usr/bin/python# -*- coding:utf-8 -*-"""使用者登入:socket連結資料庫,並進行SQL語句的定製基於資料庫的登入驗證SQL注入問題的原因:如果通過字串格式化去拼接SQL語句,將會帶來SQL注入的問題。"""import pymysqluser = input("請輸入使用者名稱:")pass_wd = input("請輸入密碼:")#使用者驗證之前與資料庫建立串連conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor()"""用戶端與資料庫建立連結之後,便可以進行相應的操作,注意:SQL語句中相應的欄位要加引號"""sql = """      select *      from userinfo      where username = %s and pass_wd = %s      """print(sql)v1 = cursor_oper.execute(sql,[user,pass_wd])print(v1)result = cursor_oper.fetchall()print(result)cursor_oper.close()conn.close()

運行結果:

請輸入使用者名稱:alex請輸入密碼:841807      select *      from userinfo      where username = %s and pass_wd = %s1((1, 'alex', '841807'),)

(四)pymysql模組對資料庫進行增刪改查操作
核心:除了查詢操作,其餘三個操作都要通過conn.commit()提交,不然無法儲存建立或者修改的資料。
①查詢操作:略(看上)
②插入操作(程式碼範例):

#!/usr/bin/python# -*- coding:utf-8 -*-"""通過pymysql對MySQL進行增、刪、改操作"""import pymysql#使用者驗證之前與資料庫建立串連conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor()"""用戶端與資料庫建立連結之後,便可以進行相應的操作"""sql = """      insert into userinfo(username,pass_wd) values(%s,%s)      """print(sql)v1 = cursor_oper.execute(sql,['zhangyiheng','6688'])print("表中受影響的行數是:%d"%v1)#凡是涉及到增刪改查操作,都需要通過連結conn向資料庫中提交操作,隨後才會生效conn.commit()cursor_oper.close()conn.close()

運行結果:

③刪除操作(程式碼範例):

#!/usr/bin/python# -*- coding:utf-8 -*-"""通過pymysql對MySQL進行增、刪、改操作"""import pymysql#使用者驗證之前與資料庫建立串連conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor()"""用戶端與資料庫建立連結之後,便可以進行相應的操作"""sql = """      delete from userinfo where username = %s      """print(sql)v1 = cursor_oper.execute(sql,['zhangyiheng'])print("表中受影響的行數是:%d"%v1)conn.commit()cursor_oper.close()conn.close()

運行結果:

④更新操作:(程式碼範例)

#!/usr/bin/python# -*- coding:utf-8 -*-"""通過pymysql對MySQL進行增、刪、改操作"""import pymysql#使用者驗證之前與資料庫建立串連conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor()"""用戶端與資料庫建立連結之後,便可以進行相應的操作"""sql = """      update userinfo set pass_wd = %s  where username = %s       """print(sql)v1 = cursor_oper.execute(sql,['343434','alex'])print("表中受影響的行數是:%d"%v1)conn.commit()cursor_oper.close()conn.close()

運行結果:

(五).通過pymysql擷取新增資料的自增ID:通過lastrowid這個方法
程式碼範例:

#!/usr/bin/python# -*- coding:utf-8 -*-"""通過pymysql擷取新增資料的自增ID:通過lastrowid這個方法"""import pymysql#使用者驗證之前與資料庫建立串連conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor()"""用戶端與資料庫建立連結之後,便可以進行相應的操作"""sql = """      insert into userinfo(username,pass_wd) values(%s,%s)      """print(sql)v1 = cursor_oper.execute(sql,['wangting','5566'])print("表中受影響的行數是:%d"%v1)#凡是涉及到增刪改查操作,都需要通過連結conn向資料庫中提交操作,隨後才會生效conn.commit()#擷取剛剛增加的資料的行健print(type(cursor_oper.lastrowid))print(cursor_oper.lastrowid)cursor_oper.close()conn.close()

運行結果:

      insert into userinfo(username,pass_wd) values(%s,%s)表中受影響的行數是:1<class 'int'>10

圖片展示:

(六).fetch資料類型的擷取
function:fetchall()、fetone()、fetmanay()預設擷取的資料是元祖類型,如果想要或者字典類型的資料,方法:
方法:遊標設定為字典類型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
前後對比:

conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor()conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor(cursor=pymysql.cursors.DictCursor)

程式碼範例:

#!/usr/bin/python# -*- coding:utf-8 -*-"""function:fetchall()、fetone()、fetmanay()擷取的結果轉化為列表,有點類似於之前dict(zip)的操作"""import pymysql#使用者驗證之前與資料庫建立串連conn = pymysql.Connect(host="192.168.80.100",port=3306,user="root",password="admin",                       database="Test_mine1",charset='utf8')cursor_oper = conn.cursor(cursor=pymysql.cursors.DictCursor)"""用戶端與資料庫建立連結之後,便可以進行相應的操作"""sql = """      select * from userinfo       """print(sql)v1 = cursor_oper.execute(sql)print("表中受影響的行數是:%d"%v1)result = cursor_oper.fetchall()print(result)cursor_oper.close()conn.close()

運行結果:

      select * from userinfo 表中受影響的行數是:6[{'uid': 1, 'pass_wd': '343434', 'username': 'alex'}, {'uid': 3, 'pass_wd': '789789', 'username': 'yuanhao'}, {'uid': 5, 'pass_wd': '99999', 'username': 'eric'}, {'uid': 7, 'pass_wd': '8866', 'username': 'lihao'}, {'uid': 8, 'pass_wd': '8866', 'username': 'lihao'}, {'uid': 10, 'pass_wd': '5566', 'username': 'wangting'}]Process finished with exit code 0
   
0
0
查看評論

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.