python:pymysql分享目錄
- 一、概念
- 二、數據準備
- 三、安裝pymysql
- 四、pymysql使用
- (一)使用步驟
- (二)查詢操作
- (三)增
- (四)改
- (五)刪
- 五、關于pymysql注入問題
一、概念
如果使用之前學習的MySQL客戶端來完成插入10000條數據的操作,那么這個工作量無疑是巨大的,在這個時候就可以使用pymysql,更高效。
PyMySQL 是一個純 Python 實現的 MySQL 客戶端庫,用于 Python 程序與 MySQL 數據庫的交互。pymysql連接速度快,協議優化,更適宜于用來處理大批量數據,
二、數據準備
例:
--1. 創建 "京東" 數據庫
create database jing_dong charset=utf8;-- 使用 "京東" 數據庫
use jing_dong;-- 創建一個商品goods數據表
create table goods(id int unsigned primary key auto_increment not null,name varchar(150) not null,cate_name varchar(40) not null,brand_name varchar(40) not null,price decimal(10,3) not null default 0,is_show bit not null default 1,is_saleoff bit not null default 0
);-- 向goods表中插入數據insert into goods values(0,'r510vc 15.6英寸筆記本','筆記本','華碩','3399',default,default);
insert into goods values(0,'y400n 14.0英寸筆記本電腦','筆記本','聯想','4999',default,default);
insert into goods values(0,'g150th 15.6英寸游戲本','游戲本','雷神','8499',default,default);
insert into goods values(0,'x550cc 15.6英寸筆記本','筆記本','華碩','2799',default,default);
insert into goods values(0,'x240 超極本','超級本','聯想','4880',default,default);
insert into goods values(0,'u330p 13.3英寸超極本','超級本','聯想','4299',default,default);
insert into goods values(0,'svp13226scb 觸控超極本','超級本','索尼','7999',default,default);
insert into goods values(0,'ipad mini 7.9英寸平板電腦','平板電腦','蘋果','1998',default,default);
insert into goods values(0,'ipad air 9.7英寸平板電腦','平板電腦','蘋果','3388',default,default);
insert into goods values(0,'ipad mini 配備 retina 顯示屏','平板電腦','蘋果','2788',default,default);
insert into goods values(0,'ideacentre c340 20英寸一體電腦 ','臺式機','聯想','3499',default,default);
insert into goods values(0,'vostro 3800-r1206 臺式電腦','臺式機','戴爾','2899',default,default);
insert into goods values(0,'imac me086ch/a 21.5英寸一體電腦','臺式機','蘋果','9188',default,default);
insert into goods values(0,'at7-7414lp 臺式電腦 linux )','臺式機','宏碁','3699',default,default);
insert into goods values(0,'z220sff f4f06pa工作站','服務器/工作站','惠普','4288',default,default);
insert into goods values(0,'poweredge ii服務器','服務器/工作站','戴爾','5388',default,default);
insert into goods values(0,'mac pro專業級臺式電腦','服務器/工作站','蘋果','28888',default,default);
insert into goods values(0,'hmz-t3w 頭戴顯示設備','筆記本配件','索尼','6999',default,default);
insert into goods values(0,'商務雙肩背包','筆記本配件','索尼','99',default,default);
insert into goods values(0,'x3250 m4機架式服務器','服務器/工作站','ibm','6888',default,default);
insert into goods values(0,'商務雙肩背包','筆記本配件','索尼','99',default,default);# 創建用戶表
create TABLE user(id int PRIMARY KEY AUTO_INCREMENT,user varchar(30),pwd varchar(30)
);
insert into user(user,pwd) VALUE ('root','123456');
三、安裝pymysql
pycharm的客戶端安裝指令:
命令1: pip install pymysql #指令1
命令2: pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple/ #指令2
下面方式也可以安裝:
四、pymysql使用
PyMySQL中的增(INSERT)、刪(DELETE)、改(UPDATE)操作與事務密切相關,以下是它們之間的關系:
基本關系
1.事務是一組操作的集合:在PyMySQL中,增刪改操作通常是在事務的上下文中執行的。
2.默認自動提交:PyMySQL默認啟用了自動提交(autocommit=True),每個增刪改語句會立即生效;如果關閉自動提交(autocommit=False),則需要顯式提交事務才能使更改永久生效。
關鍵點
原子性:事務內的所有增刪改操作要么全部成功,要么全部失敗回滾(rollback);
一致性:事務執行前后數據庫保持一致性狀態;
隔離性:事務間的增刪改操作相互隔離;
持久性:一旦事務提交,增刪改的結果將永久保存。
什么是一致性狀態?
一致性狀態指的是數據庫中的數據滿足所有預定義的業務規則和完整性約束,包括:實體完整性:主鍵不能為空參照完整性:外鍵關系必須有效用戶定義的完整性:如賬戶余額不能為負、年齡必須大于0等業務規則數據關系正確性:如總金額=單價×數量等計算關系
事務機制確保了PyMySQL中增刪改操作的可靠性和數據完整性。
(一)使用步驟
pymysql使用步驟:
1.導入模塊
2.創建連接
3.創建游標
4.執行sql
5.關閉游標
6.關閉連接
(二)查詢操作
# 1.導入pymysql模塊
import pymysql# 2.創建連接對象
conn = pymysql.connect(host='localhost',port=3306,user='root',password='root',database='jing_dong'
)
# 3.創建游標對象
cur = conn.cursor()
# 4.執行sql
row = cur.execute('SELECT * FROM goods')
print(f'影響了{row}行')
# fetchone: 一次拿一條數據
# data1 = cur.fetchone()
# print(data1)
# fetchall: 一次拿剩下的所有的數據
data2 = cur.fetchall()
print(data2)
# 5.關閉游標
cur.close()
# 6.關閉連接
conn.close()
額外分享:關于InnoDB引擎和MyISAM引擎(方便看懂后面代碼)
InnoDB要求顯式提交不是為了增加復雜度,而是為了提供:更強大的數據完整性保障更靈活的業務邏輯控制更安全的錯誤恢復機制更高的并發性能
(三)增
# 1.導入pymysql模塊
from pymysql import connect# 2.創建連接對象
conn = connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.創建游標對象
cur = conn.cursor()
# 4.執行sql語句
row = cur.execute("insert into goods(name,cate_name,brand_name) value ('測試','測試','測試')")
print(f'影響了{row}行')
# innoDB引擎要求必須提交,myisam引擎不支持事務(不commit也可以)
conn.commit()
# 5.關閉游標
cur.close()
# 6.關閉連接
conn.close()
(四)改
# 1.導入pymysql模塊
from pymysql import connect# 2.創建連接對象
conn = connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.創建游標對象
cur = conn.cursor()
# 4.執行sql語句
row = cur.execute("update goods set price = 99999 where name='測試'")
print(f'影響了{row}行')
# innoDB引擎要求必須提交,myisam引擎不支持事務(不commit也可以)
conn.commit()
# 5.關閉游標
cur.close()
# 6.關閉連接
conn.close()
(五)刪
# 1.導入pymysql模塊
from pymysql import connect# 2.創建連接對象
conn = connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.創建游標對象
cur = conn.cursor()
# 4.執行sql語句
try:row = cur.execute("DELETE FROM goods WHERE name='測試'")print(f'影響了{row}行')# a = 1 / 0
except Exception as e:print(f'老弟啊,出錯了呀...詳情:{e}')conn.rollback()# innoDB引擎要求必須提交,myisam引擎不支持事務(不commit也可以)
conn.commit()
# 5.關閉游標
cur.close()
# 6.關閉連接
conn.close()
五、關于pymysql注入問題
首先,一個實際應用中:
例:
# 用戶登錄
username = input('請輸入用戶名:')
password = input('請輸入密碼:')
# 后臺python代碼連接數據庫判斷
# 1.導入pymysql模塊
import pymysql
# 2.創建連接對象
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.創建游標對象
cur = conn.cursor()
# 4.執行sql語句(判斷是否登錄成功)
row = cur.execute(f"select * from user where user='{username}' and pwd='{password}'")
if row:print('登錄成功')
else:print('登錄失敗')
# 5.關閉游標
cur.close()
# 6.關閉連接
conn.close()
用戶可能出現下面情況(注入問題):
例:
用戶錄入:
用戶名:隨意 密碼: ' or 1=1 or '
導致系統構造后的mysql語句為:select * from user where user='root' and pwd=' 'or 1=1 or ' ', 無法達成原始驗證目的(or與前面的and被同樣識別)。
處理方法(不能太信任用戶):
解決sql注入問題: sql單獨定義,用%s占位,把所有參數放到列表里,把sql和參數列表傳給execute,這樣系統構造mysql語句將不會出錯(嚴格的代碼/數據分開)。
# 用戶登錄
username = input('請輸入用戶名:')
password = input('請輸入密碼:')
# 后臺python代碼連接數據庫判斷
# 1.導入pymysql模塊
import pymysql
# 2.創建連接對象
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='root',database='jing_dong'
)
# 3.創建游標對象
cur = conn.cursor()
# 4.執行sql語句(判斷是否登錄成功)
# 解決sql注入問題: sql單獨定義,用%s占位,把所有參數放到列表里,把sql和參數列表傳給execute
sql = "select * from user where user=%s and pwd=%s"
parm = [username,password]
row = cur.execute(sql,parm)
if row:print('登錄成功')
else:print('登錄失敗')
# 5.關閉游標
cur.close()
# 6.關閉連接
conn.close()
今天的分享到此為止。