python操作MySQL數據庫連接(pymysql)


一:python操作MySQL

1.python如何操作MySQL?
為了使python連接上數據庫,你需要一個驅動,這個驅動是用於與數據庫交互的庫。

PyMySQL : 這是一個使Python連接到MySQL的庫,它是一個純Python庫(文件夾)。

PyMySQL 是一個純 Python 實現的 MySQL 客戶端操作庫,支持事務、存取過程、批量執行,實現增刪改查等。

image

2.什么是 PyMySQL?
PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2 中則使用 mysqldb。

PyMySQL 遵循 Python 數據庫 API v2.0 規范,並包含了 pure-Python MySQL 客戶端庫。

二:PyMySQL 安裝

1.方法一:
1.命令行輸入(下載模塊 pymysql)
pip3 install pymysql

image

2.方法二:
切換下載的源(倉庫)
pip3 install pymysql -i 源地址

下載第三方模塊的方式

三:pyMySQL模塊基本使用

1.pyMySQL模塊基本使用
import pymysql

# 創建鏈接
conn = pymysql.connect(  # 賦值給 conn連接對象
    host='127.0.0.1',  # 本地回環地址
    port=3306,  # 默認端口
    user='root',  # 用戶名
    password='123',  # 密碼
    database='db_01',  # 連接數據庫名稱
    charset='utf8'  # 編碼 不能寫utf-8
)

# 生成一個游標對象(相當於cmd打開mysql中的 mysql>)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓數據自動組織成字典
# 定義SQL語句
sql = 'select * from egg'
# 執行SQL語句
cursor.execute(sql)
# 獲取返回結果
res = cursor.fetchall()
print(res)

image

三:pymysql主要方法

1.pymysql主要方法
import pymysql

# 創建鏈接
conn = pymysql.connect(  # 賦值給 conn連接對象
    host='127.0.0.1',  # 本地回環地址
    port=3306,  # 默認端口
    user='root',  # 用戶名
    password='123',  # 密碼
    database='db_01',  # 連接數據庫名稱
    charset='utf8'  # 編碼 不能寫utf-8
)

# 生成一個游標對象(相當於cmd打開mysql中的 mysql>)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓數據自動組織成字典
# 定義SQL語句
sql = 'select * from egg'
# 執行SQL語句
ret = cursor.execute(sql)

print(ret)  # 返回值是執行SQL語句之后受影響的行數

# 獲取返回結果
# res = cursor.fetchall()  # 列表套字典
# res = cursor.fetchone()  # 數據字典
# res = cursor.fetchmany(3)  # 列表套字典
print(res)

image

2.內容解析:
1.execute返回值是執行SQL語句之后受影響的行數

2.fetchall()獲取所有的結果
fetchone()獲取結果集第一個結果
fetchmany()括號內可以指定獲取幾個結果集

四:fetchall對數據存在光標的概念

1.驗證光標的存在
import pymysql

# 創建鏈接
conn = pymysql.connect(  # 賦值給 conn連接對象
    host='127.0.0.1',  # 本地回環地址
    port=3306,  # 默認端口
    user='root',  # 用戶名
    password='123',  # 密碼
    database='db_01',  # 連接數據庫名稱
    charset='utf8'  # 編碼 不能寫utf-8
)

# 生成一個游標對象(相當於cmd打開mysql中的 mysql>)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓數據自動組織成字典
# 定義SQL語句
sql = 'select * from egg'
# 執行SQL語句
ret = cursor.execute(sql)
print(ret)  # 返回值是執行SQL語句之后受影響的行數
# 獲取返回結果
res = cursor.fetchall()
res1 = cursor.fetchall()
print(res)
print(res1)

image

2.fetchone異常返回結果原因
解析:
	上述方法對數據的獲取也存在光標的概念

fetchall()獲取所有的結果

image

3.解決光標移動問題
4.相對移動(相對當前位置移動)
import pymysql

# 創建鏈接
conn = pymysql.connect(  # 賦值給 conn連接對象
    host='127.0.0.1',  # 本地回環地址
    port=3306,  # 默認端口
    user='root',  # 用戶名
    password='123',  # 密碼
    database='db_01',  # 連接數據庫名稱
    charset='utf8'  # 編碼 不能寫utf-8
)

# 生成一個游標對象(相當於cmd打開mysql中的 mysql>)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓數據自動組織成字典
# 定義SQL語句
sql = 'select * from egg'
# 執行SQL語句
ret = cursor.execute(sql)
print(ret)  # 返回值是執行SQL語句之后受影響的行數
# 獲取返回結果
res = cursor.fetchone()  # 獲取結果集的第一個結果
# cursor.scroll(1, 'relative')  # 相對當前位置移動(相對移動)
# cursor.scroll(0, 'absolute')  # 相對數據開頭位置移動(絕對移動)
res1 = cursor.fetchall()  # 獲取所有結果
print(res)
print(res1)

相對移動
image
絕對移動
image

五:SQL注入問題

1.驗證注入問題存在
import pymysql

# 創建鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_01',
    charset='utf8'
)

# 生成一個游標對象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓數據自動組織成字典

# 獲取用戶名和密碼
username = input('username>>>:').strip()
password = input('password>>>:').strip()

# 構造SQL語句
sql = "select * from egg where name='%s' and password='%s'"%(username,password)
print(sql)
# 執行sql語句
cursor.execute(sql)
# 獲取所有返回結果
res = cursor.fetchall()
# if判斷
if res:
    print(res)
    print('登錄成功')
else:
    print('用戶名或密碼錯誤')

image

目前的pymysq代碼用戶登錄是否安全了?
讓我們進行測試pymysql代碼(安全性)
2.漏洞1

image

3.漏洞2

image

4.綜合以上漏洞
1.用戶名不正確 不需要密碼也能登錄
2.用戶名和密碼都不需要也能登錄

image

5.造成sql語句漏洞的原因(sql注入問題)
SQL注入問題的產生
	就是通過一線特殊符號的組合 達到某些特定的效果從而避免常規的邏輯
SQL注入問題如何解決
    execute方法自動幫你解決

六:execute方法(解決sql注入問題)

1.execute方法
execute方法,自動將 用戶名和密碼放在對應的%s內,並且放之前會自動對用戶名和密碼做特殊符號的校驗,確保安全性。
2.解決注入問題
import pymysql

# 創建鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_01',
    charset='utf8'
)

# 生成一個游標對象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓數據自動組織成字典

登錄功能
1.獲取用戶名和密碼
2.基於用戶名和密碼直接精准查找
username = input('username>>>:').strip()
password = input('password>>>:').strip()

# 構造SQL語句
sql = "select * from egg where name=%s and password=%s"  # 針對核心數據 不要自己拼接 交由execute方法幫你篩選再拼接
print(sql)
# 執行sql語句
cursor.execute(sql,(username, password))
# 獲取所有返回結果
res = cursor.fetchall()
# if判斷
if res:
    print(res)
    print('登錄成功')
else:
    print('用戶名或密碼錯誤')

image
image

七:conn.commit()二次確認

1.二次確認作用
二次確認作用:
針對增刪改操作 需要二次確認才可生效
2.驗證不使用二次確認情況
import pymysql

# 創建鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_01',
    charset='utf8'
)

# 生成一個游標對象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓數據自動組織成字典
sql1 = 'select * from egg'  # 查詢表內數據
sql2 = 'insert into egg(name,password) values(%s,%s)'  # 插入數據
sql3 = 'update egg set name=jasonNB where id=1'  # 修改數據
sql4 = 'delete from egg where id=2'  # 刪除數據
3.查詢表內數據 無影響
cursor.execute(sql1)
print(cursor.fetchall())

image

2.插入語句能夠執行 但是並沒有影響數據
cursor.execute(sql2,('objk',123))

image

3.更新語句能夠執行,但是並沒有影響表的數據
res = cursor.execute(sql3)
print(res)

image

4.刪除語句能夠執行,但是並沒有影響數據

res = cursor.execute(sql4)
print(res)

image

5.總結:
1.查詢語句可以正常執行並獲取結果
cursor.execute(sql1)
2.插入語句能夠執行 但是並沒有影響表數據
cursor.execute(sql2,('jackson',666))
3.更新語句能夠執行 但是並沒有影響表數據
res = cursor.execute(sql3)
print(res)
4.刪除語句能夠執行 但是並沒有影響表數據
res = cursor.execute(sql4)
print(res)
6.不能實現增刪改原因
因為,該四項操作重要程度不一樣,增刪改查的級別不一樣,查的級別是最低的,所有可以操作,但是,增刪改的級別最高的,pymysq沒有權限去操作,需要使用到二次確認才能進行增刪改操作。

'''針對增刪改操作 需要二次確認才可生效 '''
7.conn.commit()二次確認
二次確認關鍵字:
commit()
作用:
	針對增刪改操作 需要二次確認才可生效
8.驗證二次確認(手動測試)
'''針對增刪改操作 需要二次確認才可生效'''
# 1.插入數據
cursor.execute(sql2,('tony',123))
# 二次確認
conn.commit()

# 2.修改數據
cursor.execute(sql3)
# 二次確認
conn.commit()

# 3.刪除數據
cursor.execute(sql4)
# 二次確認
conn.commit()

image

9.解決手動操作二次確認(自動化二次確認)
自動二次確認:
autocommmit=True  # 涉及到增刪改查 自動二次確認
import pymysql

# 創建鏈接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_01',
    charset='utf8',
    autocommit=True  # 涉及到增刪改 自動二次確認
)

# 生成一個游標對象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 讓數據自動組織成字典
sql1 = 'select * from egg'
sql2 = 'insert into egg(name,password) values(%s,%s)'
sql3 = 'update egg set name="jaonNB" where id=2'
sql4 = 'delete from egg where id=1'

'''針對增刪改操作 需要二次確認才可生效'''
# 1.插入數據
cursor.execute(sql2,('laike',123))

# 2.修改數據
cursor.execute(sql3)

# 3.刪除數據
cursor.execute(sql4)


主動關閉鏈接 釋放資源
conn.close()

image

八:executemany()同時插入多個數據

1.同時插入多個數據
# 同時插入多個數據
cursor.executemany(sql2,[('jason1',1),('jason2',2),('jason3',3)])


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM