【Python 操作 MySQL 數據庫】

在 Python 中操作 MySQL 數據庫主要通過 pymysqlmysql-connector-python 庫實現。以下是完整的技術指南,包含連接管理、CRUD 操作和最佳實踐:


一、環境準備

1. 安裝驅動庫
pip install pymysql          # 推薦(純Python實現)
# 或
pip install mysql-connector-python  # Oracle官方驅動
2. 數據庫準備
CREATE DATABASE testdb;
USE testdb;CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) UNIQUE NOT NULL,email VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

二、連接管理

1. 基礎連接
import pymysql# 建立連接
conn = pymysql.connect(host='localhost',user='root',password='your_password',database='testdb',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor  # 返回字典格式結果
)
2. 上下文管理器(推薦)
with pymysql.connect(host='localhost', user='root', password='your_pwd', database='testdb') as conn:with conn.cursor() as cursor:# 執行SQL操作pass# 連接在此處自動提交/回滾(取決于autocommit設置)

三、CRUD 操作

1. 查詢數據
def get_user(username):try:with conn.cursor() as cursor:sql = "SELECT * FROM users WHERE username = %s"cursor.execute(sql, (username,))result = cursor.fetchone()  # 獲取單條記錄return resultexcept pymysql.MySQLError as e:print(f"數據庫錯誤: {e}")return Noneuser = get_user("john_doe")
print(user)  # 輸出: {'id': 1, 'username': 'john_doe', ...}
2. 插入數據
def create_user(username, email):try:with conn.cursor() as cursor:sql = """INSERT INTO users (username, email) VALUES (%s, %s)"""cursor.execute(sql, (username, email))conn.commit()  # 顯式提交事務return cursor.lastrowid  # 返回自增IDexcept pymysql.IntegrityError:print("用戶名已存在")conn.rollback()return Nonenew_id = create_user("jane_smith", "jane@example.com")
3. 更新數據
def update_email(user_id, new_email):try:with conn.cursor() as cursor:sql = "UPDATE users SET email = %s WHERE id = %s"affected_rows = cursor.execute(sql, (new_email, user_id))conn.commit()return affected_rows > 0except pymysql.MySQLError:conn.rollback()return False
4. 批量操作
def batch_insert(users):try:with conn.cursor() as cursor:sql = "INSERT INTO users (username, email) VALUES (%s, %s)"cursor.executemany(sql, users)  # 批量執行conn.commit()return cursor.rowcountexcept pymysql.MySQLError:conn.rollback()return 0batch_insert([("user1", "u1@test.com"),("user2", "u2@test.com")
])

四、高級技巧

1. 連接池管理
from dbutils.pooled_db import PooledDBpool = PooledDB(creator=pymysql,maxconnections=10,host='localhost',user='root',password='your_pwd',database='testdb'
)# 使用連接池獲取連接
conn = pool.connection()
2. 存儲過程調用
with conn.cursor() as cursor:cursor.callproc('get_user_stats', (1,))  # 調用存儲過程result = cursor.fetchall()
3. 事務控制
try:with conn.cursor() as cursor:# 執行多個操作cursor.execute("UPDATE account SET balance = balance - 100 WHERE id = 1")cursor.execute("UPDATE account SET balance = balance + 100 WHERE id = 2")conn.commit()  # 顯式提交事務
except:conn.rollback()  # 回滾所有操作

五、安全實踐

1. 防止SQL注入
  • 永遠使用參數化查詢(不要拼接字符串)
    # 正確方式
    cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))# 危險方式(禁用!)
    cursor.execute(f"SELECT * FROM users WHERE id = {user_id}")
    
2. 敏感信息處理
  • 使用環境變量存儲密碼:
    import os
    password = os.getenv('DB_PASSWORD')
    
3. 連接超時設置
conn = pymysql.connect(connect_timeout=5,  # 連接超時5秒read_timeout=10     # 讀取超時10秒
)

六、性能優化

1. 查詢優化
  • 添加索引:

    ALTER TABLE users ADD INDEX idx_email (email);
    
  • 使用EXPLAIN分析查詢:

    with conn.cursor() as cursor:cursor.execute("EXPLAIN SELECT * FROM users WHERE username = %s", ("john",))print(cursor.fetchall())
    
2. 結果集處理
  • 分頁查詢:

    sql = "SELECT * FROM users LIMIT %s OFFSET %s"
    cursor.execute(sql, (page_size, (page-1)*page_size))
    
  • 流式讀取(大數據量):

    with conn.cursor(pymysql.cursors.SSCursor) as cursor:  # 使用服務器端游標cursor.execute("SELECT * FROM large_table")for row in cursor:process(row)
    

七、完整示例

import pymysql
from contextlib import contextmanager@contextmanager
def database_connection():conn = pymysql.connect(host='localhost',user='root',password='your_pwd',database='testdb',charset='utf8mb4')try:yield connfinally:conn.close()def main():with database_connection() as conn:with conn.cursor() as cursor:# 創建用戶cursor.execute("""INSERT INTO users (username, email)VALUES (%s, %s)""", ("new_user", "user@example.com"))user_id = cursor.lastrowid# 查詢用戶cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))print(cursor.fetchone())# 更新記錄cursor.execute("""UPDATE users SET email = %s WHERE id = %s""", ("new_email@example.com", user_id))conn.commit()if __name__ == "__main__":main()

八、故障排查

1. 常見錯誤碼
  • 1045: 訪問被拒絕(檢查用戶名/密碼)
  • 2003: 無法連接(檢查主機/端口)
  • 1062: 唯一鍵沖突
  • 1146: 表不存在
2. 日志記錄
import logging
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(levelname)s - %(message)s'
)# 在連接參數中添加
conn = pymysql.connect(..., cursorclass=pymysql.cursors.SSDictCursor,client_flag=pymysql.client.CLIENT.MULTI_STATEMENTS)

通過遵循這些實踐,可以構建安全、高效的數據庫交互應用。對于復雜場景,建議結合ORM框架(如SQLAlchemy)進行抽象層開發。

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

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

相關文章

記錄vsCode連接gitee并實現項目拉取和上傳

標題 在 VSCode 中上傳代碼到 Gitee 倉庫 要在 VSCode 中將代碼上傳到 Gitee (碼云) 倉庫,你可以按照以下步驟操作: 準備工作 確保已安裝 Git確保已安裝 VSCode擁有 Gitee 賬號并創建了倉庫 可以參考該文章的部分:idea實現與gitee連接 操…

【信息系統項目管理師】第6章:項目管理概論 - 31個經典題目及詳解

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 第一節 PMBOK的發展【第1題】【第2題】【第3題】【第4題】【第5題】【第6題】第二節 項目基本要素【第1題】【第2題】【第3題】【第4題】【第5題】【第6題】【第7題】【第8題】【第9題】【第10題】第三節 項目經…

簡單介紹C++中線性代數運算庫Eigen

Eigen 是一個高性能的 C 模板庫,專注于線性代數、矩陣和向量運算,廣泛應用于科學計算、機器學習和計算機視覺等領域。以下是對 Eigen 庫的詳細介紹: 1. 概述 核心功能:支持矩陣、向量運算,包括基本算術、矩陣分解&…

生產級編排AI工作流套件:Flyte全面使用指南 — Core concepts Launch plans

生產級編排AI工作流套件:Flyte全面使用指南 — Core concepts Launch plans Flyte 是一個開源編排器,用于構建生產級數據和機器學習流水線。它以 Kubernetes 作為底層平臺,注重可擴展性和可重復性。借助 Flyte,用戶團隊可以使用 P…

Python 之類型注解

類型注解允許開發者顯式地聲明變量、函數參數和返回值的類型。但是加不加注解對于程序的運行沒任何影響(是非強制的,且類型注解不影響運行時行為),屬于 有了挺好,沒有也行。但是大型項目按照規范添加注解的話&#xff…

rocketmq并發消費

netty的handler 在netty的網絡模型中,在想bootstrap設置handler時, 都是在等待 事件 的到來,才會被調用的方法,都是被動的, 服務端等待 request 的到來,進行read, 然后主動調用writeAndFlush寫出去。 客戶…

React 播客專欄 Vol.9|React + TypeScript 項目該怎么起步?從 CRA 到配置全流程

👋 歡迎回到《前端達人 React 播客書單》第 9 期(正文內容為學習筆記摘要,音頻內容是詳細的解讀,方便你理解),請點擊下方收聽 你是不是常在網上看到 .tsx 項目、Babel、Webpack、tsconfig、Vite、CRA、ESL…

【PmHub后端篇】PmHub中基于自定義注解和AOP的服務接口鑒權與內部認證實現

1 引言 在現代軟件開發中,尤其是在微服務架構下,服務接口的鑒權和內部認證是保障系統安全的重要環節。本文將詳細介紹PmHub中如何利用自定義注解和AOP(面向切面編程)實現服務接口的鑒權和內部認證,所涉及的技術知識點…

芯片測試之X-ray測試

原理: X-ray是利用陰極射線管產生高能量電子與金屬靶撞擊,在撞擊過程中,因電子突然減速,其損失的動能會以X-Ray形式放出。而對于樣品無法以外觀方式觀測的位置,利用X-Ray穿透不同密度物質后其光強度的變化,…

QBasic 一款古老的編程語言在現代學習中的價值(附程序)

QBasic(Quick Beginner’s All-purpose Symbolic Instruction Code)是微軟公司于 1991 年推出的一款簡單易學的編程語言,作為BASIC語言的變種,它曾廣泛應用于教育領域和初學者編程入門。盡管在當今Python、Java等現代編程語言主導…

【八股戰神篇】Java高頻基礎面試題

1 面向對象編程有哪些特性? 面向對象編程(Object-Oriented Programming,簡稱 OOP)是一種以對象為核心的編程范式,它通過模擬現實世界中的事物及其關系來組織代碼。OOP 具有三大核心特性:封裝、繼承、多態。…

科學養生指南:解鎖健康生活新方式

在快節奏的現代生活中,健康養生成為人們關注的焦點。想要擁有良好的身體狀態,無需依賴復雜的傳統理論,通過科學的生活方式,就能輕松實現養生目標。? 規律運動是健康的基石。每周進行 150 分鐘以上的中等強度有氧運動&#xff0c…

OpenCV閾值處理完全指南:從基礎到高級應用

引言 閾值處理是圖像處理中最基礎、最常用的技術之一,它能夠將灰度圖像轉換為二值圖像,為后續的圖像分析和處理奠定基礎。本文將全面介紹OpenCV中的各種閾值處理方法,包括原理講解、代碼實現和實際應用場景。 一、什么是閾值處理&#xff1…

Java8到24新特性整理

本文整理了 Java 8 至 Java 24 各版本的新特性,內容包括每個版本的新增功能分類(如語法增強、性能優化、工具支持等)、詳細的代碼示例,并結合官方文檔資料,分析每項特性的應用場景及優缺點。Java 8 發布于 2014 年&…

輪詢仲裁器

參考視頻 https://www.bilibili.com/video/BV1VQ4y1w7Rr/?spm_id_from333.337.search-card.all.click&vd_sourceaedd69dc9740e91cdd85c0dfaf25304b 算法原理

Armijo rule

非精線搜索步長規則Armijo規則&Goldstein規則&Wolfe規則_armijo rule-CSDN博客 [原創]用“人話”解釋不精確線搜索中的Armijo-Goldstein準則及Wolfe-Powell準則 – 編碼無悔 / Intent & Focused

力扣HOT100之二叉樹:102. 二叉樹的層序遍歷

這道題太簡單了,相當于基礎的模板題,但凡涉及到層序遍歷一定會用到隊列來實現,其他的倒沒啥好說的,用兩層while循環來層序遍歷,外層while循環用于控制訪問二叉樹的每一層,而內層while循環則負責收割每一層的…

Ubuntu24.04 安裝 5080顯卡驅動以及cuda

前言 之前使用Ubuntu22.04版本一直報錯,然后換了24.04版本才能正常安裝 一. 配置基礎環境 Linux系統進行環境開發環境配置-CSDN博客 二. 安裝顯卡驅動 1.安裝驅動 按以下步驟來: sudo apt update && sudo apt upgrade -y#下載最新內核并安裝 sudo add…

WAS和Tomcat的對比

一、WAS和Tomcat的對比 WebSphere Application Server (WAS) 和 Apache Tomcat 是兩款常用的 Java 應用服務器,但它們有許多顯著的區別。在企業級應用中,它們扮演不同的角色,各自有其特點和適用場景。以下是它們在多個維度上的詳細對比&…

asp.net IHttpHandler 對分塊傳輸編碼的支持,IIs web服務器后端技術

IHttpHandler,不支持分塊傳輸編碼(Chunked Transfer)吧? IHttpHandler 對分塊傳輸編碼的支持 實際上,IHttpHandler 完全支持分塊傳輸編碼(Chunked Transfer Encoding),但具體行為取…