(1)pymysql模塊的下載python
pip3 install pymysql
(2)pymysql的使用mysql
# 實現:使用Python實現用戶登陸,若是用戶存在則登陸成功(假設該用戶已在數據庫中) import pymysql user = input('請輸入用戶名:') pwd = input('請輸入密碼:') # 1.鏈接 conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='', db='db8', charset='utf8') # 2.建立遊標 cursor = conn.cursor() #注意%s須要加引號 sql = "select * from userinfo where username='%s' and pwd='%s'" %(user, pwd) print(sql) # 3.執行sql語句 cursor.execute(sql) result=cursor.execute(sql) #執行sql語句,返回sql查詢成功的記錄數目 print(result) # 關閉鏈接,遊標和鏈接都要關閉 cursor.close() conn.close() if result: print('登錄成功') else: print('登陸失敗')
最後那一個空格,在一條sql語句中若是遇到select * from userinfo where username='mjj' -- asadasdas' and pwd='' 則--以後的條件被註釋掉了(注意--後面還有一個空格) #一、sql注入之:用戶存在,繞過密碼 mjj' -- 任意字符 #二、sql注入之:用戶不存在,繞過用戶與密碼 xxx' or 1=1 -- 任意字符
解決方法:sql
# 原來是咱們對sql進行字符串拼接 # sql="select * from userinfo where name='%s' and password='%s'" %(username,pwd) # print(sql) # result=cursor.execute(sql) #改寫爲(execute幫咱們作字符串拼接,咱們無需且必定不能再爲%s加引號了) sql="select * from userinfo where name=%s and password=%s" #!!!注意%s須要去掉引號,由於pymysql會自動爲咱們加上 result=cursor.execute(sql,[user,pwd]) #pymysql模塊自動幫咱們解決sql注入的問題,只要咱們按照pymysql的規矩來。
commit()方法:在數據庫裏增、刪、改的時候,必需要進行提交,不然插入的數據不生效。數據庫
import pymysql username = input('請輸入用戶名:') pwd = input('請輸入密碼:') # 1.鏈接 conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8') # 2.建立遊標 cursor = conn.cursor() # 操做 # 增 # sql = "insert into userinfo(username,pwd) values (%s,%s)" # effect_row = cursor.execute(sql,(username,pwd)) #同時插入多條數據 #cursor.executemany(sql,[('李四','110'),('王五','119')]) # print(effect_row)# # 改 # sql = "update userinfo set username = %s where id = 2" # effect_row = cursor.execute(sql,username) # print(effect_row) # 刪 sql = "delete from userinfo where id = 2" effect_row = cursor.execute(sql) print(effect_row) #必定記得commit conn.commit() # 4.關閉遊標 cursor.close() # 5.關閉鏈接 conn.close()
fetchone():獲取下一行數據,第一次爲首行; fetchall():獲取全部行數據源 fetchmany(4):獲取4行數據
查看一下表內容:fetch
mysql> select * from userinfo; +----+----------+-----+ | id | username | pwd | +----+----------+-----+ | 1 | mjj | 123 | | 3 | 張三 | 110 | | 4 | 李四 | 119 | +----+----------+-----+ 3 rows in set (0.00 sec)
使用fetchone():指針
import pymysql # 1.鏈接 conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8') # 2.建立遊標 cursor = conn.cursor() sql = 'select * from userinfo' cursor.execute(sql) # 查詢第一行的數據 row = cursor.fetchone() print(row) # (1, 'mjj', '123') # 查詢第二行數據 row = cursor.fetchone() print(row) # (3, '張三', '110') # 4.關閉遊標 cursor.close() # 5.關閉鏈接 conn.close()
使用fetchall():code
import pymysql # 1.鏈接 conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8') # 2.建立遊標 cursor = conn.cursor() sql = 'select * from userinfo' cursor.execute(sql) # 獲取全部的數據 rows = cursor.fetchall() print(rows) # 4.關閉遊標 cursor.close() # 5.關閉鏈接 conn.close() #運行結果 ((1, 'mjj', '123'), (3, '張三', '110'), (4, '李四', '119'))
默認狀況下,咱們獲取到的返回值是元組,只能看到每行的數據,殊不知道每一列表明的是什麼,這個時候可使用如下方式來返回字典,每一行的數據都會生成一個字典:blog
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #在實例化的時候,將屬性cursor設置爲pymysql.cursors.DictCursor
在fetchone示例中,在獲取行數據的時候,能夠理解開始的時候,有一個行指針指着第一行的上方,獲取一行,它就向下移動一行,因此當行指針到最後一行的時候,就不能再獲取到行的內容,因此咱們可使用以下方法來移動行指針:ip
cursor.scroll(1,mode='relative') # 相對當前位置移動 cursor.scroll(2,mode='absolute') # 相對絕對位置移動 第一個值爲移動的行數,整數爲向下移動,負數爲向上移動,mode指定了是相對當前位置移動,仍是相對於首行移動
# 1.Python實現用戶登陸 # 2.Mysql保存數據 import pymysql # 1.鏈接 conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8') # 2.建立遊標 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = 'select * from userinfo' cursor.execute(sql) # 查詢第一行的數據 row = cursor.fetchone() print(row) # (1, 'mjj', '123') # 查詢第二行數據 row = cursor.fetchone() # (3, '張三', '110') print(row) cursor.scroll(-1,mode='relative') #設置以後,光標相對於當前位置往前移動了一行,因此打印的結果爲第二行的數據 row = cursor.fetchone() print(row) cursor.scroll(0,mode='absolute') #設置以後,光標相對於首行沒有任何變化,因此打印的結果爲第一行數據 row = cursor.fetchone() print(row) # 4.關閉遊標 cursor.close() # 5.關閉鏈接 conn.close() #結果以下 {'id': 1, 'username': 'mjj', 'pwd': '123'} {'id': 3, 'username': '張三', 'pwd': '110'} {'id': 3, 'username': '張三', 'pwd': '110'} {'id': 1, 'username': 'mjj', 'pwd': '123'}
fetchmany():字符串
import pymysql # 1.鏈接 conn = pymysql.connect(host='localhost', port=3306, user='root', password='', db='db8', charset='utf8') # 2.建立遊標 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) sql = 'select * from userinfo' cursor.execute(sql) # 獲取2條數據 rows = cursor.fetchmany(2) print(rows) # 4.關閉遊標 # rows = cursor.fetchall() # print(rows) cursor.close() # 5.關閉鏈接 conn.close() #結果以下: [{'id': 1, 'username': 'mjj', 'pwd': '123'}, {'id': 3, 'username': '張三', 'pwd': '110'}]