1. 程式人生 > >Python學習 Day 056 - MySql - pymysql 的使用

Python學習 Day 056 - MySql - pymysql 的使用

主要內容:

  • 1.pymysql的下載和使用
  • 2.excute() 中sql 注入
  • 3.cursor 
  • 4.增 刪 改 操作
  • 5. 查

 

1.pymysql 的下載和使用

pymysql模組,該模組本質就是一個套接字客戶端軟體,通過 pymysql模組 我們就可以在python程式中操作資料庫

1.1pymysql 的下載

#在pycharm的 Terminal 中輸入指令
 pip install pymysql

1.2 pymysql 模組的使用

(1)在資料庫中建立一張存使用者賬號密碼的表

mysql> select * from
userinfo; +----+------+------+ | id | name | pwd | +----+------+------+ | 1 | alex | 1234 | +----+------+------+

(2)pycharm 程式碼

#匯入pymysql模組
import pymysql
username ,password= input ("請輸入使用者名稱"),input ("請輸入密碼")
#連線資料庫
conn =pymysql.connect(
    host='127.0.0.1',     #這個是ip地址,此處填寫的是本機的迴環地址(也可以填localhost)
user ='root', #資料庫使用者名稱 password='', #資料庫使用者名稱密碼 database ='db10', # 資料庫名,該資料庫中有存放賬號密碼的表 port=3306, #埠號 預設3306 charset ='utf8' #編碼方式,和資料庫編碼方式一致 ) #建立遊標,用來操作資料庫語句 cur = conn.cursor() #資料庫語句 (注意此處的%s 需要加'') sql ="select * from userinfo where name='%s' and pwd ='%s'
" % (username,password) #執行sql語句 result =cur.execute(sql) #關閉游標 cur.close() if result: print('登入成功') else: print("登入失敗")

2.excute() 中sql 注入

2.1注入現象

最後那一個空格,在一條sql語句中如果遇到
select * from userinfo where username='alex' -- asadasdas' and pwd='' 則--之後的條件被註釋掉了(注意--後面還有一個空格)

#1、sql注入之:使用者存在,繞過密碼
alex' -- 任意字元

#2、sql注入之:使用者不存在,繞過使用者與密碼
xxx' or 1=1 -- 任意字元

2.2 解決

# 原來是我們對sql進行字串拼接
# sql="select * from userinfo where name='%s' and pwd='%s'" %(username,password)
# result=cursor.execute(sql)

#改寫為(execute幫我們做字串拼接,我們無需且一定不能再為%s加引號了)
 #!!!注意%s需要去掉引號,因為pymysql會自動為我們加上
sql="select * from userinfo where name=%s and password=%s"
#pymysql模組自動幫我們解決sql注入的問題,只要我們按照pymysql的規矩來。
#當execute中列表和密碼是按列表方式傳入
result=cur.execute(sql,[user,pwd]) 
#此時得到的結果是元祖

sql="select * from userinfo where name=%(name)s and password=%(password)s" 
result=cur.execute(sql,{"name":username,"password":pwd})
#此時輸出結果為字典形式

3. cursor物件

Cursor物件就是對資料庫進行具體的操作了,比如增、刪、改、查等等一系列操作都可以完成

型別 描述
Cursor 普通的遊標物件,預設建立的遊標物件
SSCursor 不快取遊標,主要用於當操作需要返回大量資料的時候
DictCursor 以字典的形式返回操作結果
SSDictCursor 不快取遊標,將結果以字典的相識進行返回

 

 

 

 

 

 

 

 

注:不快取遊標的特點是:根據需要獲取行,不是將所有的資料都複製到緩衝區。這樣做的好處是:客戶端使用更少的記憶體,並且當網速慢時或者結果集非常大時,返回行的速度要快得多

 4.增 刪 改 操作

 5.查

#獲取下一行資料,第一次為首行;
etchone():
#獲取所有行資料來源
fetchall():
#獲取4行資料
fetchmany(4):

預設情況下,我們獲取到的返回值是元組,只能看到每行的資料,卻不知道每一列代表的是什麼,這個時候可以使用以下方式來返回字典,每一行的資料都會生成一個字典:

#在例項化的時候,將屬性cursor設定為pymysql.cursors.DictCursor
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  

移動指標:

 # 相對當前位置移動
cursor.scroll(1,mode='relative') 
# 相對絕對位置移動
cursor.scroll(2,mode='absolute') 
#第一個值為移動的行數,整數為向下移動,負數為向上移動,mode指定了是相對當前位置移動,還是相對於首行移動