python操作mysql之pymysql


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()


免責聲明!

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



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