python:pymysql概念、基本操作和注入問題講解

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()

今天的分享到此為止。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83746.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

職坐標AIoT技能培訓課程實戰解析

職坐標AIoT技能培訓課程以人工智能與物聯網技術深度融合為核心,構建了“理論實戰行業應用”三位一體的教學體系。課程體系覆蓋Python編程基礎、傳感器數據采集、邊緣計算開發、云端服務部署及智能硬件開發全鏈路,通過分層遞進的知識模塊幫助學員建立系統…

MySQL 用戶權限管理:從入門到精通

在當今數據驅動的時代,數據庫安全已成為企業信息安全體系的核心組成部分。作為最流行的開源關系型數據庫之一,MySQL 的用戶權限管理系統提供了強大而靈活的訪問控制機制。本文將全面解析 MySQL 用戶權限管理的各個方面,幫助數據庫管理員和開發…

Java常見API文檔(下)

格式化的時間形式的常用模式對應關系如下: 空參構造創造simdateformate對象,默認格式 練習.按照指定格式展示 package kl002;import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;public class Date3 {publi…

博圖1200硬件組態與啟保停程序編寫步驟詳解

一、前言 在工業自動化控制領域,西門子S7-1200 PLC因其性能穩定、編程靈活而廣受歡迎。本文將詳細介紹使用TIA Portal(博圖)軟件進行S7-1200 PLC硬件組態以及編寫基本啟保停程序的完整步驟,幫助初學者快速掌握這一基礎而重要的技…

AutoMouser - 單次AI調用鑄就高效自動化腳本

你是否厭倦了反復點點點的枯燥操作?是否希望像科幻電影那樣,一句指令,萬事搞定?如果告訴你,現在只需要一次AI調用,就能自動執行一整套鼠標腳本操作,你會不會覺得:自動化的時代&#…

雙周報Vol.72:字段級文檔注釋支持、視圖類型現為值類型,減少內存分配

雙周報Vol.72:字段級文檔注釋支持、視圖類型現為值類型,減少內存分配 更新目錄 ..調用鏈末尾自動丟棄值語義變更字段級文檔注釋支持視圖類型現為值類型,減少內存分配特效函數調用現支持樣式高亮實驗性支持虛擬包,接口與實現解耦 …

OceanBase 開發者大會:詳解 Data × AI 戰略,數據庫一體化架構再升級

OceanBase 2025 開發者大會與5月17日在廣州舉行。這是繼 4 月底 OceanBase CEO 楊冰宣布公司全面進入AI 時代后的首場技術盛會。會上,OceanBase CTO 楊傳輝系統性地闡述了公司的 DataAI 戰略,并發布了三大產品:PowerRAG、共享存儲&#xff0c…

大小端模式和消息的加密解密

大小端模式 知識點一 什么是大小端模式 // 大端模式 // 是指數據的高字節保存在內存的低地址中 // 而數據的低字節保存在內存的高地址中 // 這樣的存儲模式有點兒類似于把數據當作字符串順序處理 // 地址由小向大增加,數據從高位往低位放 …

WebRTC技術EasyRTC嵌入式音視頻通信SDK助力智能電視搭建沉浸式實時音視頻交互

一、方案概述? EasyRTC是一款基于WebRTC技術的開源實時音視頻通信解決方案,具備低延遲、高畫質、跨平臺等優勢。將EasyRTC功能應用于智能電視,能夠為用戶帶來全新的交互體驗,滿足智能電視在家庭娛樂、遠程教育、遠程辦公、遠程醫療等多種場…

Supermemory:讓大模型擁有“長效記憶“

目錄 引言:打破大語言模型的記憶瓶頸,迎接AI交互新范式 一、Supermemory 核心技術 1.1 透明代理機制 1.2 智能分段與檢索系統 1.3 自動Token管理 二、易用性 三、性能與成本 四、可靠性與兼容性 五、為何選擇 Supermemory? 六、對…

2025.5.17總結

周六上了一天的課,從早上9:30至下午6:30,在這個過程中,確實也收獲了不少。 1.結識了更多的大佬和不同職業的精英。 一個在某科技公司做開發的主管甘阿碰,當我聽到科技公司,還以為是公司里的一…

語音識別——通過PyAudio錄入音頻

PyAudio 是一個用于處理音頻的 Python 庫,它提供了錄制和播放音頻的功能。通過 PyAudio,可以輕松地從麥克風或其他音頻輸入設備錄制音頻,并將其保存為文件或進行進一步處理。 安裝 PyAudio 在使用 PyAudio 之前,需要先安裝它。可…

python打卡day30

模塊和庫的導入 知識點回顧: 導入官方庫的三種手段導入自定義庫/模塊的方式導入庫/模塊的核心邏輯:找到根目錄(python解釋器的目錄和終端的目錄不一致) 作業:自己新建幾個不同路徑文件嘗試下如何導入 python的學習就像…

C++ —— Lambda 表達式

🎁個人主頁:工藤新一 🔍系列專欄:C面向對象(類和對象篇) 🌟心中的天空之城,終會照亮我前方的路 🎉歡迎大家點贊👍評論📝收藏?文章 文章目錄 L…

十三、面向對象底層邏輯-Dubbo序列化Serialization接口

一、引言:分布式通信的數據橋梁 在分布式服務調用中,參數的跨網絡傳輸需要將對象轉化為二進制流,這一過程直接影響系統的性能、兼容性與安全性。Dubbo通過Serialization接口構建了可擴展的序列化體系,支持多種序列化協議的無縫切…

批量剪輯 + 矩陣分發 + 數字人分身源碼搭建全技術解析,支持OEM

在互聯網內容生態蓬勃發展的當下,企業與創作者對內容生產與傳播效率的要求日益增長。批量剪輯、矩陣分發和數字人分身技術的融合,成為提升內容創作與運營效能的關鍵方案。從源碼層面實現三者的搭建與整合,需要深入理解各功能技術原理&#xf…

Java List 接口知識點詳解

一、List 接口概述 1. 基本定義 繼承關系:List 是 Java 集合框架(Collection Framework)中的一個有序隊列接口,直接繼承自 Collection 接口。核心特性: 有序性:元素按插入順序存儲,可通過索引…

OpenCV-去噪效果和評估指標方法

實驗前言 噪音類型 opencv常見噪音類型有 高斯噪音:高斯噪音是一種隨機噪音,其數值服從正態分布。圖像受到高斯噪音的影響時,像素值的變化類似于白噪音,但是噪音的強度會隨像素值的變化而變化。 椒鹽噪音:椒鹽噪音是…

永磁同步電機公式總結【一】——反電動勢、磁鏈、轉矩公式;三項、兩項電壓方程;坐標表換方程

一、PMSM 電機參數介紹 1.1 轉子極數 轉子極數 (Rotor Poles) :三相交流電機每組線圈都會產生 N、S 磁極,每個電機每相含有的永磁體磁極個數就是極數。由于磁極是成對出現的,所以電機有 2、4、6、8……極 (偶數)。 未知參數的電機&#xff…

eMMC深度解析:嵌入式多媒體卡的硬件電路設計要點

一、eMMC 技術深度解析 1.定義與背景 eMMC(Embedded Multi Media Card)是一種專為嵌入式系統設計的非易失性存儲解決方案,它將 NAND 閃存、主控芯片和接口協議封裝在一個 BGA(Ball Grid Array)封裝中。其核心目標是簡…