day40:MySQL:python操作mysql:pymysql模組&SQL隱碼攻擊

Poke發表於2020-08-28

目錄

part1:用python連線mysql

  1.用python連線mysql的基本語法

  2.用python 建立&刪除表

  3.用python操作事務處理

part2:sql注入攻擊

  1.sql注入的現象

  2.預處理機制:防止sql注入現象

part3:python操作mysql增刪改查

part4:匯出匯入資料庫

part1:用python連線mysql

1.用python連線mysql的基本語法

建立連線conn→建立遊標物件cursor→執行sql語句execute→獲取資料fetchone→釋放遊標物件cursor→關閉連線conn

# (1) 建立連線  host  user  password  database 這四個引數必須寫
conn = pymysql.connect(host="127.0.0.1",user="root",password="123456",database="db0826",charset="utf8",port=3306)

# (2) 建立遊標物件(該物件可以運算元據庫增刪改查)
cursor = conn.cursor()

# (3) 執行sql語句
sql = "select * from employee"
# 返回的是資料的總條數
res = cursor.execute(sql)
print(res)

# (4)獲取資料 fetchone 獲取一條
res = cursor.fetchone()
res = cursor.fetchone()
print(res)

# (5) 釋放遊標物件
cursor.close()

# (6) 關閉連線
conn.close()

2.用python 建立&刪除表

1,2,5,6步驟都是不變的,只改變3.4步即可

conn = pymysql.connect(host="127.0.0.1",user="root",password="123456",database="db0826")
cursor = conn.cursor()

# 1.建立一張表
sql = """
create table t1(
id int unsigned primary key auto_increment,
first_name char(10) not null,
last_name char(10) not null,
age int unsigned,
sex tinyint,
money float
)
"""

# res = cursor.execute(sql)
# print(res)

# 2.檢視錶結構
"""
sql = "desc t1"
res = cursor.execute(sql)
print(res) # 6條欄位資料
print(cursor.fetchone())
print(cursor.fetchone())
print(cursor.fetchone())
print(cursor.fetchone())
print(cursor.fetchone())
print(cursor.fetchone())
"""

# 3.刪除表
"""
try:
    sql = "drop table t1"
    res = cursor.execute(sql)
    print(res)
except:
    pass
"""
cursor.close()
conn.close()

3.用python操作事務處理

pymysql 操作事務處理時,需要commit提交資料,才會變化,否則rollback回滾.恢復到最初狀態

請注意:你sql語句裡寫的是增刪改,你得到的execute的返回值沒有任何意義,所以你fetchone是無效的,只有你sql語句寫的是查詢的操作,fetchone才能獲取到資料     

conn = pymysql.connect(host="127.0.0.1",user="root",password="123456",database="db0826")
cursor = conn.cursor()
sql1 = "begin"
sql2 = "update employee set emp_name = '123egon' where id = 1"
sql3 = "commit"
res1 = cursor.execute(sql1)
res2 = cursor.execute(sql2)
res3 = cursor.execute(sql3)
# print(res1,res2,res3) # 返回值沒有意義
# fetchone 與查詢sql有關 , 增刪改無效;
# tup = cursor.fetchone()
# print(tup)

cursor.close()
conn.close()

part2:sql注入攻擊

先建立一張使用者名稱-密碼錶

create table usr_pwd(
id int unsigned primary key auto_increment,
username varchar(255) not null,
password varchar(255) not null
)

1.sql注入的現象

import pymysql
user = input("請輸入使用者名稱: >>> ").strip()
pwd = input("請輸入密碼: >>> ").strip()

conn = pymysql.connect(host="127.0.0.1",user="root",password="123456",database="db0826")
cursor = conn.cursor()

sql = "select * from usr_pwd where username='%s' and password='%s' " % (user,pwd)
print(sql)
res = cursor.execute(sql)
print(res) # 查詢的條數

if res:
    print("登入成功")
else:
    print("登陸失敗")

cursor.close()
conn.close()

輸入時賬號輸入:sfsdf' or 3=3 -- sdfsd 密碼隨意輸入都可以登入成功

原因:-- 後面的字串都會被註釋掉, 前面賬號雖然是錯的 但是 2=2是真的 繞開了賬號和密碼的判斷;

select * from usr_pwd where username='afasdfasdfasdf' or 2=2 -- sfasdf' and password='3434

2.預處理機制:防止sql注入現象

使用預處理機制,可以避免絕大多數sql注入的問題

execute 如果引數為2個,將預設開啟預處理

execute(sql , (引數1,引數2,引數3 .... ) )

import pymysql
user = input("請輸入使用者名稱: >>> ").strip()
pwd = input("請輸入密碼: >>> ").strip()


conn = pymysql.connect(host="127.0.0.1",user="root",password="123456",database="db0826")
cursor = conn.cursor()
sql = "select * from usr_pwd where username=%s and password=%s"
res = cursor.execute(sql, (user,pwd) )


print("登陸成功" if res  else "登入失敗")

cursor.close()
conn.close()

part3:python操作mysql增刪改查

1.建立遊標時,可以指定返回值型別為其他(預設是元組)

# 建立mysql 連結
conn = pymysql.connect(host="127.0.0.1",user="root",password="123456",database="db0826")

# 查詢資料,預設是元組,可以設定返回的型別為字典 pymysql.cursors.DictCursor
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

2.python操作mysql增操作

cursor.executemany:可以一次插入多條資料

cursor.lastrowid:獲取最後插入這條資料的id號(僅針對單條資料插入)

# sql增語句
sql = "insert into t1(first_name,last_name,age,sex,money) values(%s,%s,%s,%s,%s)"

# 一次插入一條
res = cursor.execute(sql, ("","雲傑",30,0,15000) )
print(res) # 1
# 獲取最後插入這條資料的id號(針對單條資料插入)
print(cursor.lastrowid) # 3

# 一次插入多條
res = cursor.executemany(  sql,  [  ("","雲峰",50,1,16000) , ("","",80,1,17000) , ("","偉倬",120,0,130000) , ("","欣慰",150,0,18000)   ]   )
print(res) # 列印的是插入的條數4

# 針對於多條資料,搜最後的id 可以通過倒序查詢id
sql = "select id from t1 order by id desc limit 1"
res = cursor.execute(sql)
print(res)
# 獲取最後一個id號
res = cursor.fetchone()
print(res)

3.python操作mysql刪操作

sql = "delete from t1 where id = %s"
res = cursor.execute(sql , (3,))
print(res)
if res:    
    print("刪除成功")
else:
    print("刪除失敗")

4.python操作mysql改操作

sql = "update t1 set first_name = %s where id = %s"
res = cursor.execute(sql,("",4))
print(res)

if res:
    print("修改成功")
else:
    print("修改失敗")

5.python操作mysql查操作

要注意:fetchone  fetchmany fetchall 都是基於上一條資料往下查詢

1.獲取一條資料:fetchone

sql = "select * from t1"
res = cursor.execute(sql)
print(res) # 總條數

res = cursor.fetchone()
print(res) # 獲取一條

2.獲取多條資料:fetchmany

sql = "select * from t1"
res = cursor.execute(sql)
print(res) # 總條數

data = cursor.fetchmany() # 括號裡不寫引數,預設搜尋的的是一條資料
print(data)
data = cursor.fetchmany(3) # 基於上一次獲取完的位置再獲取三條
print(data) 

data一共是三條資料,我們可以通過for迴圈取出每一條資料,並且按照自己的格式進行拼接

for row in data :
    # print(row)
    first_name = row["first_name"]
    last_name = row["last_name"]
    age = row["age"]
    if row["sex"] == 0:
        sex = "女性"
    else:
        sex = "男性"
    
    money = row["money"]
    print("姓:{},名:{},年齡:{},姓名:{},收入:{}".format(first_name,last_name,age,sex,money)  )

3.獲取所有資料: fetchall

sql = "select * from t1"
res = cursor.execute(sql)
print(res) # 總條數

data = cursor.fetchall()
print(data)

4.自定義搜尋查詢的位置

1.相對滾動 (正數相對於當前位置往後滾,負數相對於當前位置往後滾.)

# 向前滾3個
cursor.scroll(3,mode="relative")
res = cursor.fetchone()
print(res)

# 往後滾2個
cursor.scroll(-2,mode="relative")
res = cursor.fetchone()
print(res)

2.絕對滾動 , 永遠基於第一條資料的位置進行移動

cursor.scroll(0,mode="absolute")
print(cursor.fetchone())

cursor.scroll(1,mode="absolute")
print(cursor.fetchone())

cursor.scroll(3,mode="absolute")
print(cursor.fetchone())

# 往前滾沒有資料,超出範圍 error報錯
cursor.scroll(-1,mode="absolute")
print(cursor.fetchone())

# 在進行增刪改查時,必須提交資料,才會產生影響.
conn.commit()
cursor.close()
conn.close()

part4:匯出匯入資料庫

1.匯出資料庫

第一步: 先退出資料庫

第二步: 切換到對應的路徑(你想將匯出的資料庫檔案放到哪個目錄)

  mysqldump -uroot -p db0824 > db0824.sql

第三步:匯出所有內容(整個資料庫)

  mysqldump -uroot -p db0824 > db0824.sql

匯出資料庫中的單個表

  mysqldump -uroot -p db0824 t1 > t1.sql

2.匯入資料庫

第一步 : 先建立一個空的資料庫

第二步 : 找到sql對應檔案目錄

第三步 : source 路徑/檔案

        use 資料庫

       source D:\db0824.sql

相關文章