Python連接mysql數據庫
pymsql介紹
PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2中則使用mysqldb。
Django中也可以使用PyMySQL連接MySQL數據庫。
pymsql安裝
pip install pymysql
登陸驗證中,之前學習的都是建立一個文件,通過把用戶信息保存在這個文件中,然后一行一行的去讀,做校驗

# 獲取用戶輸入 name=input('用戶名:') pwd=input('密碼:') # 校驗用戶輸入的用戶名和密碼是否正確 with open("userinfo.txt") as f: for line in f: # 按照空格去分隔每一行,把值分別賦值給name_tmp和pwd_tmp name_tmp,pwd_tmp=line.strip().split(" ") # 如果能匹配上用戶的輸入,就表示登陸成功 if name_tmp ==name and pwd_tmp==pwd: print("登陸成功") break else: print('登錄失敗')
上面的代碼是通過文件操作來完成登陸驗證的,但是有一個問題是每次都要一行一行的去讀,而不能像使用數據庫那樣可以通過索引去找到要驗證一條信息
下面引出通過pymsql讓Python代碼與mysql數據庫建立連接
pymsql的使用
使用方法

# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 定義要執行的SQL語句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE, age TINYINT NOT NULL )ENGINE=innodb DEFAULT CHARSET=utf8; """ # 執行SQL語句 cursor.execute(sql) # 關閉光標對象 cursor.close() # 關閉數據庫連接 conn.close()

import pymysql # 校驗 用戶輸入的用戶名和密碼是否正確 # 去數據庫里取數據做判斷 # 1.連上數據庫,獲得的conn是連接 conn = pymysql.connect(host="localhost",database="s8",user="root",password="123456",charset="utf8") # 只有連接還不行,還需要獲取光標,讓我能夠輸入sql語句並執行 cursor=conn.cursor() #cursor是光標 # 2.執行sql語句 sql="select * from userinfo where id>3;" #要執行的sql語句寫出來 ret = cursor.execute(sql) #execute是執行的意思,執行sql語句 # 3.關閉光標和連接 cursor.close() conn.close() print("%s row in set (0.00 sec)" % ret) ''' 在這個例題中,mysql相當於是serversocket端,pycharm是客戶端 客戶端需要先於服務端建立連接,也就是本例題中的第1步 建立好連接后需要建立通信,也就是第2步,把我要執行的sql給執行了,並把 執行結果返回給變量ret,並保存在變量中 通信結束后需要斷開連接,但在本例題中也獲得了光標,需要把光標也關閉 '''
sql注入問題

import pymysql name=input('用戶名:') pwd=input('密碼:') # 校驗用戶輸入的用戶名和密碼是否正確 # 去數據庫里取數據做判斷 # 1.連接上數據庫 conn=pymysql.connect(host='localhost',database='s8',user='root',password='123456',charset='utf8') # 2.獲取光標 cursor=conn.cursor() # 3.寫出要執行的sql語句 sql="select * from userinfo where name= '%s' and pwd='%s';" % (name,pwd) print(sql) # 4.執行sql ret = cursor.execute(sql) #獲取影響的行數 # 5.關閉光標和連接 cursor.close() conn.close() if ret: print('登陸成功') else: print('登陸失敗') ''' 這個例子會出現一個問題就是sql注入 就是當用戶名上輸入alex' or 1=1 -- hehehe,密碼不輸入也會登陸成功 當我正常輸入用戶名和密碼的時候是可以正常判斷執行的 當我在用戶名上輸入alex'or 1=1 --hehe時,實際在mysql數據庫中的顯示的sql 語句是select * from userinfo where name= 'alex' or 1=1 -- hehe' and pwd=''; 1=1為真 --在mysql中是注釋,所以這個sql語句會被當做select * from userinfo where name= 'alex' or 1=1去執行,所以,在沒有輸入密碼的情況下就可以顯示登陸成功,這就是sql注入 '''
解決sql注入問題
# 原來是我們對sql進行字符串拼接 # sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd) # print(sql) # res=cursor.execute(sql) #改寫為(execute幫我們做字符串拼接,我們無需且一定不能再為%s加引號了) sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引號,因為pymysql會自動為我們加上 res=cursor.execute(sql,[user,pwd]) #pymysql模塊自動幫我們解決sql注入的問題,只要我們按照pymysql的規矩來。

import pymysql # 獲取用戶輸入 name= input('用戶名:') pwd =input('密碼:') # 校驗用戶輸入的用戶名和密碼是否正確 # 去數據庫里取數據做判斷 # 1.連接上數據庫 conn=pymysql.connect(host='localhost',database='s8',user='root',password='123456',charset='utf8') # 2.獲取光標 cursor=conn.cursor() # 3.要執行的sql語句 sql="select * from userinfo where name='%s' and pwd='%s';"%(name,pwd) print(sql) # 4.讓pymysql拼接字符串 ret=cursor.execute(sql,[name,pwd]) #獲取影響的行數 這里也可以寫成ret=cursor.execute(sql,(name,pwd)) # 5.關閉光標和連接 cursor.close() conn.close() if ret: print('登陸成功') else: print('登陸失敗') ''' 第四步中execute中寫上要執行的sql語句,要判斷的字段,pymsql會自動的去判斷輸入的信息, 這樣就避免了sql注入的問題 '''
通過pymsq增加數據庫中的數據

import pymysql # 連接 conn=pymysql.connect(host="localhost",user='root',password="123456",charset="utf8",database="s8") # 獲取光標 cursor=conn.cursor() # 寫sql語句 sql="insert into userinfo (name,pwd) VALUE (%s,%s);" username='egon2' password='dashabi' try: # 執行sql語句 cursor.execute(sql,(username,password)) conn.commit() #把修改的數據提交到數據庫 except Exception as e: conn.rollback() #捕捉到錯誤就回滾 cursor.close() conn.close()
通過pymsql刪除數據庫中的數據

import pymysql # 連接 conn=pymysql.connect(host="localhost",database="s8",user="root",password="123456",charset="utf8") # 獲取光標 cursor=conn.cursor() # 寫sql語句 sql="delete from userinfo where name=%s;" username='egon2' try: # 執行sql語句 cursor.execute(sql,(username,)) conn.commit() #把修改提交到數據庫 except Exception as e: conn.rollback() cursor.close() conn.close()
通過pymsql修改數據庫中的數據

import pymysql # 連接 username=input('用戶名') conn = pymysql.connect(host="localhost", user="root", password="root1234", database="s8", charset="utf8") # 沒有- # 獲取光標 cursor=conn.cursor() # 寫sql語句 sql="update userinfo set pwd=%s where name=%s" print(sql) ret=cursor.execute(sql,(username,)) print(ret) # try: # # 執行sql語句 # cursor.execute(sql,(password,username)) # conn.commit() #把修改提交到數據庫 # except Exception as e: # conn.rollback() # print('沒有') cursor.close() conn.close()
通過pymsql查詢數據庫中的數據

import pymysql # 連接 conn = pymysql.connect(host="localhost", user="root", password="123456", database="s8", charset="utf8") # 沒有- # 獲取光標 cursor = conn.cursor() # 寫sql語句 sql = "select * from userinfo;" # 執行sql語句 ret=cursor.execute(sql) print('-->',ret) # 一次取一條 print(cursor.fetchone()) print(cursor.fetchone()) print(cursor.fetchone()) # 一次取所有 # print(cursor.fetchall()) # 自定義取出多少條 # print(cursor.fetchmany(3)) # 進階用法 print(cursor.fetchone()) print(cursor.fetchall()) print(cursor.fetchone()) #如果取不到會返回None # 移動取數據的光標 cursor.scroll(-2) #默認是相對移動 print(cursor.fetchone()) # 按照絕對位置去移動 cursor.scroll(4,mode='absolute') print(cursor.fetchone()) cursor.close() conn.close()
通過pymsql批量操作數據庫中的數據

import pymysql # 連接 conn=pymysql.connect(host='localhost',database='s8',user='root',password='123456',charset='utf8') # 獲取光標 cursor=conn.cursor() # 寫sql語句 sql="insert into userinfo(name,pwd) values(%s,%s);" user1='dww1' pwd1='123456' user2='dww2' pwd2='123456' # 把所有要插入的信息保存在元祖或列表中 data=((user1,pwd1),(user2,pwd2)) try: # 執行sql語句 cursor.executemany(sql,data) #使用executemany做批量處理 conn.commit() #把修改提交到數據庫 except Exception as e : conn.rollback() cursor.close() conn.close()
獲取插入數據的ID(關聯操作時會用到)

import pymysql # 連接 conn=pymysql.connect(host="localhost",user='root',password='123456',database='s8',charset='utf8') # 獲取光標 cursor=conn.cursor() # 寫sql語句 sql="insert into userinfo(name,pwd) values(%s,%s);" user1='dww' pwd1='111111' try: # 執行sql語句 cursor.execute(sql,(user1,pwd1)) conn.commit() #把修改提交到數據庫 # 拿到我插入的這條數據的id last_id=cursor.lastrowid print('--->剛才插入的那條數據的id值是:',last_id) except Exception as e: conn.rollback() cursor.close() conn.close()
插入數據失敗回滾

# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect(host=“你的數據庫地址”, user=“用戶名”,password=“密碼”,database=“數據庫名”,charset=“utf8”) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 try: # 執行SQL語句 cursor.execute(sql, [username, age]) # 提交事務 conn.commit() except Exception as e: # 有異常,回滾事務 conn.rollback() cursor.close() conn.close()