Python操作MySQL的兩種方法詳解
今天詳細(xì)講解一下在 Python 中連接 MySQL 數(shù)據(jù)庫(kù)的幾種主流方法。這將是一個(gè)從基礎(chǔ)到進(jìn)階的完整指南。
核心庫(kù)選擇
在 Python 中連接 MySQL,主要有兩個(gè)流行的驅(qū)動(dòng):
1. mysql-connector-python: MySQL 官方提供的純 Python 驅(qū)動(dòng)。無(wú)需其他依賴,安裝簡(jiǎn)單。
2. PyMySQL: 一個(gè)純 Python 的 MySQL 客戶端,兼容性很好,非常流行。
3. (底層驅(qū)動(dòng)) MySQLdb: 一個(gè) C 擴(kuò)展模塊,速度很快,但在 Python 3 上安裝可能較麻煩,通常被 PyMySQL 替代。
對(duì)于現(xiàn)代項(xiàng)目,PyMySQL 和 mysql-connector-python 是最常見的選擇。本指南將以 `PyMySQL` 和 `SQLAlchemy` 為例。
方法一:使用 PyMySQL 直接連接(基礎(chǔ)方法)
這種方式提供了最直接的 SQL 操作,適合需要完全控制 SQL 語(yǔ)句的場(chǎng)景。
1. 安裝庫(kù)
pip install pymysql
2. 基本連接與操作流程
完整的操作流程遵循 連接 -> 創(chuàng)建游標(biāo) -> 執(zhí)行SQL -> 提交 -> 關(guān)閉 的步驟。
import pymysql
from pymysql.cursors import DictCursor 可選,用于獲取字典格式的結(jié)果
1. 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(
host='localhost', 數(shù)據(jù)庫(kù)服務(wù)器地址,本地可用 localhost 或 127.0.0.1
user='your_username', 用戶名
password='your_password', 密碼
database='your_database_name', 要連接的數(shù)據(jù)庫(kù)名
charset='utf8mb4', 字符集,支持中文和表情符號(hào)推薦 utf8mb4
cursorclass=DictCursor 可選:設(shè)置游標(biāo)類型,返回字典而非元組
)
try:
2. 創(chuàng)建一個(gè)游標(biāo)對(duì)象,用于執(zhí)行SQL語(yǔ)句
with connection.cursor() as cursor:
示例1: 執(zhí)行一條 SELECT 查詢
sql = "SELECT `id`, `name` FROM `users` WHERE `email` = %s"
cursor.execute(sql, ('user@example.com',)) 使用參數(shù)化查詢,防止SQL注入!
獲取結(jié)果
result = cursor.fetchone() 獲取單條記錄
print(result) 如果是DictCursor,輸出: {'id': 1, 'name': 'John'}
如果用默認(rèn)游標(biāo),輸出: (1, 'John')
獲取所有記錄
results = cursor.fetchall()
for row in results:
print(row)
示例2: 執(zhí)行一條 INSERT 語(yǔ)句
with connection.cursor() as cursor:
sql = "INSERT INTO `users` (`name`, `email`) VALUES (%s, %s)"
cursor.execute(sql, ('Alice', 'alice@example.com'))
3. 提交事務(wù)!對(duì)于INSERT/UPDATE/DELETE等寫操作,必須提交才會(huì)生效。
connection.commit()
示例3: 獲取剛插入數(shù)據(jù)的主鍵ID
with connection.cursor() as cursor:
sql = "INSERT INTO `users` (`name`, `email`) VALUES (%s, %s)"
cursor.execute(sql, ('Bob', 'bob@example.com'))
connection.commit()
print(f"新插入記錄的ID是: {cursor.lastrowid}")
finally:
4. 關(guān)閉連接,釋放資源
connection.close()3. 使用上下文管理器 (推薦)
為了確保連接總是能被正確關(guān)閉,即使發(fā)生異常,推薦使用 `with` 語(yǔ)句。
import pymysql
使用 with 語(yǔ)句自動(dòng)管理連接和游標(biāo)的關(guān)閉
try:
with pymysql.connect(host='localhost', user='root', password='password', database='test') as conn:
with conn.cursor() as cursor:
cursor.execute("SELECT VERSION()")
result = cursor.fetchone()
print(f"Database version: {result[0]}")
連接結(jié)束時(shí),如果沒有異常,會(huì)自動(dòng) commit(); 如果有異常,會(huì)自動(dòng) rollback()
except pymysql.Error as e:
print(f"Database error: {e}")方法二:使用 SQLAlchemy (ORM 框架,進(jìn)階方法)
ORM (Object-Relational Mapping) 允許你使用 Python 類和對(duì)象來(lái)操作數(shù)據(jù)庫(kù),而不是直接寫 SQL。這對(duì)于大型、復(fù)雜的項(xiàng)目非常有益,可以提高開發(fā)效率和代碼可維護(hù)性。
1. 安裝
pip install sqlalchemy pymysql
2. 核心組件與連接
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
1. 定義數(shù)據(jù)庫(kù)連接字符串
格式: dialect+driver://username:password@host:port/database
DB_URI = 'mysql+pymysql://username:password@localhost:3306/your_database?charset=utf8mb4'
2. 創(chuàng)建引擎 (Engine),它是ORM和數(shù)據(jù)庫(kù)的連接核心
engine = create_engine(DB_URI, echo=True) echo=True 會(huì)打印執(zhí)行的SQL,調(diào)試時(shí)有用
3. 創(chuàng)建基類
Base = declarative_base()
4. 定義映射類(模型)
class User(Base):
__tablename__ = 'users' 指定映射的表名
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50), nullable=False)
email = Column(String(100), unique=True)
5. 創(chuàng)建所有表(如果不存在)
Base.metadata.create_all(engine)
6. 創(chuàng)建會(huì)話工廠 (Session)
Session = sessionmaker(bind=engine)
7. 使用會(huì)話進(jìn)行增刪改查
新增數(shù)據(jù)
with Session() as session:
new_user = User(name='Charlie', email='charlie@example.com')
session.add(new_user)
session.commit() 提交事務(wù)
print(f"New user ID: {new_user.id}") 提交后,id自動(dòng)賦值
查詢數(shù)據(jù)
with Session() as session:
查詢所有用戶
users = session.query(User).all()
for user in users:
print(user.id, user.name, user.email)
條件查詢
user = session.query(User).filter_by(name='Charlie').first()
if user:
print(f"Found user: {user.name}")最佳實(shí)踐與重要提示
1. 安全第一:永遠(yuǎn)使用參數(shù)化查詢
錯(cuò)誤做法(SQL注入風(fēng)險(xiǎn)): `cursor.execute(f"SELECT * FROM users WHERE name = '{user_input}'")`
正確做法: `cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,))`
PyMySQL 使用 `%s` 作為占位符,即使數(shù)據(jù)是數(shù)字或日期。
2. 管理敏感信息
切勿將數(shù)據(jù)庫(kù)密碼等硬編碼在代碼中!
使用環(huán)境變量或配置文件(如 `.env` 文件)來(lái)管理。
示例(使用 `python-dotenv`):
pip install python-dotenv
.env 文件
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_secure_password
DB_NAME=my_app
```
```python
app.py
from dotenv import load_dotenv
import os
import pymysql
load_dotenv() 加載 .env 文件中的環(huán)境變量
connection = pymysql.connect(
host=os.getenv('DB_HOST'),
user=os.getenv('DB_USER'),
password=os.getenv('DB_PASSWORD'),
database=os.getenv('DB_NAME')
)3. 連接管理
數(shù)據(jù)庫(kù)連接是昂貴的資源,一定要確保在使用后正確關(guān)閉。強(qiáng)烈推薦使用 `with` 語(yǔ)句上下文管理器。
4. 選擇策略
簡(jiǎn)單腳本、需要精細(xì)控制SQL:選擇 PyMySQL 或 mysql-connector-python。
Web應(yīng)用、復(fù)雜業(yè)務(wù)邏輯、希望代碼更Pythonic:選擇 SQLAlchemy ORM。
另外搭配便捷的MYSQL備份工具,可定時(shí)備份、異地備份,MYSQL導(dǎo)出導(dǎo)入。可本地連接LINUX里的MYSQL,簡(jiǎn)單便捷??梢源蟠蟮靥岣吖ぷ餍枢?。
以上就是Python操作MySQL的兩種方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Python操作MySQL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)統(tǒng)計(jì)代碼行的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)統(tǒng)計(jì)代碼行的方法,結(jié)合實(shí)例形式分析了Python針對(duì)代碼行數(shù)的計(jì)算實(shí)現(xiàn)步驟與操作技巧,需要的朋友可以參考下2017-07-07
python對(duì)excel文檔去重及求和的實(shí)例
下面小編就為大家分享一篇python對(duì)excel文檔去重及求和的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-04-04
Python?hashlib模塊與哈希算法保護(hù)數(shù)據(jù)完整性教程
hashlib模塊為Python提供了一種簡(jiǎn)便的方式來(lái)使用各種哈希算法,如MD5、SHA-1、SHA-256等,哈希函數(shù)廣泛用于密碼學(xué)、數(shù)據(jù)完整性驗(yàn)證和安全存儲(chǔ)等領(lǐng)域2024-01-01
Flask框架運(yùn)用Ajax實(shí)現(xiàn)輪詢動(dòng)態(tài)繪圖
Ajax是異步JavaScript和XML可用于前后端交互,本文將通過Ajax輪詢獲取后端的數(shù)據(jù),前臺(tái)使用echart繪圖庫(kù)進(jìn)行圖形的生成與展示,最后實(shí)現(xiàn)動(dòng)態(tài)監(jiān)控內(nèi)存利用率的這個(gè)功能,需要的可以參考一下2022-11-11
python淘寶搶購(gòu)腳本程序?qū)崿F(xiàn)
大家好,本篇文章主要講的是python淘寶搶購(gòu)腳本程序?qū)崿F(xiàn),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
python中halcon環(huán)境配置的詳細(xì)步驟
這篇文章主要為大家詳細(xì)介紹了python中halcon環(huán)境配置的詳細(xì)步驟,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解一下2025-06-06
Python Sql數(shù)據(jù)庫(kù)增刪改查操作簡(jiǎn)單封裝
這篇文章主要為大家介紹了Python Sql數(shù)據(jù)庫(kù)增刪改查操作簡(jiǎn)單封裝,感興趣的小伙伴們可以參考一下2016-04-04

