python操作mysql之pymysql
准備工作:
下載固定模塊:
方法一:命令下載 pip3 isntall pymysql
方法二:借助於pycharm
模塊的基本使用
import pymysql # 導入模塊
# 創建鏈接
conn = pymysql.connect(
host='127.0.0.1', # 本地回環地址
port=3306, # mysql固定端口好3306
user='root', # 用戶名
password='123', # 密碼
database='db5', # 必須指定庫
charset='utf8' # 注意這里不可以寫utf-8
)
# 生成一個游標對象(相當於cmd下的打開mysql的命令界面 mysql> )
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 括號內的命令是讓數據自動組織成字典
# 定義sql語句
sql = 'select * from user'
# 執行sql語句
cursor.execute(sql)
# 獲取返回結果
res = cursor.fetchall()
print(res)
sql注入問題
在講解什么是sql注入問題之前我們來看一個現象:
# 使用數據庫寫一個簡單的用戶注冊登錄:
import pymysql
# 創建鏈接
conn = pymysql.connect(
host='127.0.0.1', # 本地回環地址
port=3306, # mysql固定端口好3306
user='root', # 用戶名
password='123', # 密碼
database='db5', # 必須指定庫
charset='utf8' # 注意這里不可以寫utf-8
)
# 生成一個游標對象(相當於cmd下的打開mysql的命令界面 mysql> )
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('用戶名:').strip()
password = input('密碼:').strip()
sql = "select * from user where user ='%s' and password='%s'"%(username,password)
print(sql)
cursor.execute(sql)
res = cursor.fetchall()
if res:
print('登陸成功')
else:
print('用戶名或密碼錯誤')
驗證是沒有問題的,但是我們來看一個現象:
# 我們觀察上述問題:
問題1
用戶名正確 不需要密碼也能登錄
問題2
用戶名和密碼都不需要也能登錄
這就是sql注入問題:
SQL注入問題的產生:
就是通過一些特殊符號的組合 達到某些特定的效果從而避免常規的邏輯
SQL注入問題如何解決:
execute方法自動幫你解決
演示execute方法:
import pymysql
# 創建鏈接
conn = pymysql.connect(
host='127.0.0.1', # 本地回環地址
port=3306, # mysql固定端口好3306
user='root', # 用戶名
password='123', # 密碼
database='db5', # 必須指定庫
charset='utf8' # 注意這里不可以寫utf-8
)
# 生成一個游標對象(相當於cmd下的打開mysql的命令界面 mysql> )
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 獲取用戶名和密碼
username = input('用戶名:').strip()
password = input('密碼:').strip()
# 構建sql語句
# sql = "select * from user where user ='%s' and password='%s'"%(username,password)
sql = "select * from user where user =%s and password=%s"
print(sql)
cursor.execute(sql,(username,password)) # 使用execute
res = cursor.fetchall()
if res:
print(res)
print('登陸成功')
else:
print('用戶名或密碼錯誤')
這里就解決了sql注入的問題 只需要用到固定的方法execute即可
pymysql autocommit自動二次確認
autocommit二次確認:設計到增刪改都需要二次確認 autocommit就解決了手動二次確認,在設計增刪改查時默認二次確認的效果。
那么接下來我們來看一下為什么需要二次確認,二次確認到底時為了實現什么呢?
import pymysql
# 創建鏈接
conn = pymysql.connect(
host='127.0.0.1', # 本地回環地址
port=3306, # mysql固定端口好3306
user='root', # 用戶名
password='123', # 密碼
database='db5', # 必須指定庫
charset='utf8' # 注意這里不可以寫utf-8
)
# 生成一個游標對象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 讓數據自動組織成字典
sql1 = 'select * from user' # 查看數據
sql2 = 'insert into user(user ,password) values(%s,%s)' # 插入數據
sql3 = 'update user set user =tom22 where id=2' # 修改數據
sql4 = 'delete from user where id=2' # 刪除數據
1、查詢數據結果:
cursor.execute(sql1)
print(cursor.fetchall())
2、插入數據結果:
cursor.execute(sql2,('haha',123123)) # 插入數據就無需返回結果了
3、修改數據結果:
res = cursor.execute(sql3) # 執行sql3將tom改為tom22 # cursor的返回結果為影響了幾行
print(res)
4、刪除表數據
總結:
# 1.查詢語句可以正常執行並獲取結果
# cursor.execute(sql1)
# 2.插入語句能夠執行 但是並沒有影響表數據
# cursor.execute(sql2,('jackson',666))
# 3.更新語句能夠執行 但是並沒有影響表數據
# res = cursor.execute(sql3)
# print(res)
# 4.刪除語句能夠執行 但是並沒有影響表數據
# res = cursor.execute(sql4)
# print(res)
解釋:在針對增刪改查操作時他們的重要程度不一樣(級別不一樣) 查功能的級別是最低的,增刪改都是要影響到數據信息的,pymysql規定必須需要一個二次確認才可生效。
怎么進行二次確認呢?
關鍵字:commit()
在執行增刪改操作的下面 執行 conn.commit()命令進行二次確認
# 驗證:
解決手動添加二次確認問題:
# 這樣感覺每次執行增刪改操作都要執行conn.commit()命令非常的麻煩.
這里就用到我們開頭提到的自動二次確認 autocommit :
使用:
在創建pymysql添加: autocommit=True
補充 executemany():
定義: 在我們要插入很多數據的時候 就要使用到executemany()
使用:
cursor.executemany(sql2,[('tom',111),('toom',222),('tooom',333)])
驗證:
補充:
主動關閉連接 釋放資源(用在代碼塊最后): conn.close()