主要內容:python
1.pymysql 的下載和使用mysql
pymysql模塊,該模塊本質就是一個套接字客戶端軟件,經過 pymysql模塊 咱們就能夠在python程序中操做數據庫sql
1.1pymysql 的下載數據庫
#在pycharm的 Terminal 中輸入指令 pip install pymysql
1.2 pymysql 模塊的使用緩存
(1)在數據庫中建立一張存用戶帳號密碼的表fetch
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 注入spa
2.1注入現象指針
最後那一個空格,在一條sql語句中若是遇到 select * from userinfo where username='alex' -- asadasdas' and pwd='' 則--以後的條件被註釋掉了(注意--後面還有一個空格) #一、sql注入之:用戶存在,繞過密碼 alex' -- 任意字符 #二、sql注入之:用戶不存在,繞過用戶與密碼 xxx' or 1=1 -- 任意字符
2.2 解決code
# 原來是咱們對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指定了是相對當前位置移動,仍是相對於首行移動