目錄
一:python操作MySQL
1.python如何操作MySQL?
為了使python連接上數據庫,你需要一個驅動,這個驅動是用於與數據庫交互的庫。
PyMySQL : 這是一個使Python連接到MySQL的庫,它是一個純Python庫(文件夾)。
PyMySQL 是一個純 Python 實現的 MySQL 客戶端操作庫,支持事務、存取過程、批量執行,實現增刪改查等。
2.什么是 PyMySQL?
PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2 中則使用 mysqldb。
PyMySQL 遵循 Python 數據庫 API v2.0 規范,並包含了 pure-Python MySQL 客戶端庫。
二:PyMySQL 安裝
1.方法一:
1.命令行輸入(下載模塊 pymysql)
pip3 install pymysql
2.方法二:
切換下載的源(倉庫)
pip3 install pymysql -i 源地址
下載第三方模塊的方式
- 下載模塊與切換源詳細教程:https://www.cnblogs.com/goOJBK/p/15621209.html
三: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)
三: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)
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)
2.fetchone異常返回結果原因
解析:
上述方法對數據的獲取也存在光標的概念
fetchall()獲取所有的結果
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)
相對移動
絕對移動
五: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('用戶名或密碼錯誤')
目前的pymysq代碼用戶登錄是否安全了?
讓我們進行測試pymysql代碼(安全性)
2.漏洞1
3.漏洞2
4.綜合以上漏洞
1.用戶名不正確 不需要密碼也能登錄
2.用戶名和密碼都不需要也能登錄
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('用戶名或密碼錯誤')
七: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())
2.插入語句能夠執行 但是並沒有影響數據
cursor.execute(sql2,('objk',123))
3.更新語句能夠執行,但是並沒有影響表的數據
res = cursor.execute(sql3)
print(res)
4.刪除語句能夠執行,但是並沒有影響數據
res = cursor.execute(sql4)
print(res)
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()
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()
八:executemany()同時插入多個數據
1.同時插入多個數據
# 同時插入多個數據
cursor.executemany(sql2,[('jason1',1),('jason2',2),('jason3',3)])