Python學習 Day 056 - MySql - pymysql 的使用
阿新 • • 發佈:2018-11-23
主要內容:
- 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 * fromuserinfo; +----+------+------+ | 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指定了是相對當前位置移動,還是相對於首行移動