一、PyMySQL安裝
pip install pymysql # cmd中安裝(命令行操作)
二、連接數據庫
1、基本操作
# 導入pymysql模塊 import pymysql # 連接database conn = pymysql.connect( host='數據庫ip地址', port='端口號', user='用戶名', password='密碼', database='數據庫名', charset='utf8' # 不要用utf-8 ) # 得到一個可以執行SQL語句的光標對象 cursor = conn.cursor() # 得到一個可以執行SQL語句並且將結果作為字典返回的光標對象 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 定義要執行的SQL語句(創建表結構) sql = ''' create table userinfo( id int auto_increment primary key, username varchar(20) not null unique, password varchar(20) not null ) engine=innodb default charset=utf8; ''' # 執行SQL語句 cursor.execute(sql) # 關閉光標對象 cursor.close() # 關閉數據庫連接 conn.close()
2、SQL注入
2.1 什么是SQL注入?
用戶輸入的內容有惡意的SQL語句,后端拿到用戶輸入的內容不做檢測直接做字符串拼接,得到一個和預期不一致的SQL語句
2.2 如何解決SQL注入?
對用戶輸入的內容做檢測
pymysql 模塊內置了這種檢測,我們只需要讓pymysql幫我們拼接SQL語句
ret = cursor.execute(sql, [name, pwd]) # 讓pymysql 模塊幫我們拼接SQL語句,執行SQL語句
''' Mysql SQL注入 ''' import pymysql # 獲取用戶輸入 name = input('請輸入用戶名:') pwd = input('請輸入密碼:') # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # 3.執行SQL語句 sql = "select * from userinfo where username='%s' and password='%s';" % (name, pwd) print(sql) ret = cursor.execute(sql) # 關閉 cursor.close() conn.close() if ret: print('登錄成功') else: print('登錄失敗') ''' 如果用戶輸入:(正確的用戶名' -- 然后密碼隨便輸入,也可以成功登錄),因為--表示注釋,相當於把后面的密碼給注釋掉了 或者用戶輸入:(錯誤的用戶名' or 1=1 -- 然后密碼隨便輸入,也可以成功登錄) 所以用普通的字符串拼接是很危險的 ''' # 解決方法:用pymysql幫我們拼接SQL語句 import pymysql # 獲取用戶輸入 name = input('請輸入用戶名:') pwd = input('請輸入密碼:') # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # 3.執行SQL語句 sql = "select * from userinfo where username=%s and password=%s;" # 按照pymysql模塊的寫法定義好占位符 print(sql) ret = cursor.execute(sql, [name, pwd]) # 讓pymysql模塊幫我們拼接SQL語句,執行sql語句 # 關閉 cursor.close() conn.close() if ret: print('登錄成功') else: print('登錄失敗')
3、增刪改查操作
增
''' 向userinfo表插入一條數據 ''' import pymysql # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # 3.執行SQL語句 sql = "insert into userinfo(username, password) values (%s,%s);"cursor.execute(sql, ['石曉', '123']) # 涉及操作數據庫的,一定要提交 conn.commit() # 關閉 cursor.close() conn.close()
插入數據失敗回滾
在執行增刪改操作時,如果不想提交前面的操作,可以使用 rollback() 回滾取消操作。
''' 向userinfo表插入一條數據 ''' import pymysql # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # 3.執行SQL語句 sql = "insert into userinfo(username, password) values (%s,%s);" try: cursor.execute(sql, ['石曉', '123']) # 涉及操作數據庫的,一定要提交 conn.commit() except Exception: # 有異常,回滾事務 conn.rollback() # 關閉 cursor.close() conn.close()
獲取插入數據的ID(關聯操作時會用到)
''' 向userinfo表插入一條數據 ''' import pymysql # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # 3.執行SQL語句 sql = "insert into userinfo(username, password) values (%s,%s);" try: cursor.execute(sql, ['石曉', '123']) # 涉及操作數據庫的,一定要提交 conn.commit() # 提交之后,獲取剛插入的數據的ID last_id = cursor.lastrowid except Exception: # 有異常,回滾事務 conn.rollback() # 關閉 cursor.close() conn.close()
批量執行
''' 向userinfo表批量插入數據 ''' import pymysql # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # 3.執行SQL語句 sql = "insert into userinfo(username, password) values (%s,%s);" data = [('何思浩','123'),('王瑞臣','123'),('老王','123')] try: cursor.executemany(sql, data) # 涉及操作數據庫的,一定要提交 conn.commit() except Exception: # 有異常,回滾事務 conn.rollback() # 關閉 cursor.close() conn.close()
刪
''' 從userinfo表刪掉一條數據 ''' import pymysql # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # 3.執行SQL語句 sql = "delete from userinfo where username=%s;" cursor.execute(sql, ['alex']) # 4.提交 conn.commit() # 5.關閉 cursor.close() conn.close()
改
''' 從userinfo把其中一個用戶的密碼改成789 ''' import pymysql # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # 3.執行SQL語句 sql = "update userinfo set password=%s where username=%s" cursor.execute(sql, ['789', 'taibai']) # 4.涉及操作數據庫的,一定要提交 conn.commit() # 5.關閉 cursor.close() conn.close()
查
''' 從userinfo查詢數據 ''' import pymysql # 1.連接數據庫,得到一個連接 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='yang', database='day43', charset='utf8' ) # 2.獲取光標 cursor = conn.cursor() # cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 字典類型 # 3.執行SQL語句 sql = "select * from userinfo;" cursor.execute(sql) ret = cursor.fetchall() # 查看全部數據 print(ret) ret = cursor.fetchone() # 查看單條數據 print(ret) ret = cursor.fetchone() # 查看單條數據 print(ret) ret = cursor.fetchmany(3) # 指定數量查看 print(ret) # 4.關閉 cursor.close() conn.close()
進階用法
# 移動光標位置 cursor.scroll(0, mode='absolute') # 絕對位置,讓光標移動到哪就到哪 cursor.scroll(-1, mode='relative') # 相對位置,負數則向前移動,正數向后移動