Python操作MySQL的兩種方法詳解
今天詳細講解一下在 Python 中連接 MySQL 數(shù)據(jù)庫的幾種主流方法。這將是一個從基礎(chǔ)到進階的完整指南。
核心庫選擇
在 Python 中連接 MySQL,主要有兩個流行的驅(qū)動:
1. mysql-connector-python: MySQL 官方提供的純 Python 驅(qū)動。無需其他依賴,安裝簡單。
2. PyMySQL: 一個純 Python 的 MySQL 客戶端,兼容性很好,非常流行。
3. (底層驅(qū)動) MySQLdb: 一個 C 擴展模塊,速度很快,但在 Python 3 上安裝可能較麻煩,通常被 PyMySQL 替代。
對于現(xiàn)代項目,PyMySQL 和 mysql-connector-python 是最常見的選擇。本指南將以 `PyMySQL` 和 `SQLAlchemy` 為例。
方法一:使用 PyMySQL 直接連接(基礎(chǔ)方法)
這種方式提供了最直接的 SQL 操作,適合需要完全控制 SQL 語句的場景。
1. 安裝庫
pip install pymysql
2. 基本連接與操作流程
完整的操作流程遵循 連接 -> 創(chuàng)建游標(biāo) -> 執(zhí)行SQL -> 提交 -> 關(guān)閉 的步驟。
import pymysql
from pymysql.cursors import DictCursor 可選,用于獲取字典格式的結(jié)果
1. 建立數(shù)據(jù)庫連接
connection = pymysql.connect(
host='localhost', 數(shù)據(jù)庫服務(wù)器地址,本地可用 localhost 或 127.0.0.1
user='your_username', 用戶名
password='your_password', 密碼
database='your_database_name', 要連接的數(shù)據(jù)庫名
charset='utf8mb4', 字符集,支持中文和表情符號推薦 utf8mb4
cursorclass=DictCursor 可選:設(shè)置游標(biāo)類型,返回字典而非元組
)
try:
2. 創(chuàng)建一個游標(biāo)對象,用于執(zhí)行SQL語句
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'}
如果用默認游標(biāo),輸出: (1, 'John')
獲取所有記錄
results = cursor.fetchall()
for row in results:
print(row)
示例2: 執(zhí)行一條 INSERT 語句
with connection.cursor() as cursor:
sql = "INSERT INTO `users` (`name`, `email`) VALUES (%s, %s)"
cursor.execute(sql, ('Alice', 'alice@example.com'))
3. 提交事務(wù)!對于INSERT/UPDATE/DELETE等寫操作,必須提交才會生效。
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` 語句。
import pymysql
使用 with 語句自動管理連接和游標(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é)束時,如果沒有異常,會自動 commit(); 如果有異常,會自動 rollback()
except pymysql.Error as e:
print(f"Database error: {e}")方法二:使用 SQLAlchemy (ORM 框架,進階方法)
ORM (Object-Relational Mapping) 允許你使用 Python 類和對象來操作數(shù)據(jù)庫,而不是直接寫 SQL。這對于大型、復(fù)雜的項目非常有益,可以提高開發(fā)效率和代碼可維護性。
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ù)庫連接字符串
格式: 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ù)庫的連接核心
engine = create_engine(DB_URI, echo=True) echo=True 會打印執(zhí)行的SQL,調(diào)試時有用
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)建會話工廠 (Session)
Session = sessionmaker(bind=engine)
7. 使用會話進行增刪改查
新增數(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自動賦值
查詢數(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}")最佳實踐與重要提示
1. 安全第一:永遠使用參數(shù)化查詢
錯誤做法(SQL注入風(fēng)險): `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ù)庫密碼等硬編碼在代碼中!
使用環(huán)境變量或配置文件(如 `.env` 文件)來管理。
示例(使用 `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ù)庫連接是昂貴的資源,一定要確保在使用后正確關(guān)閉。強烈推薦使用 `with` 語句上下文管理器。
4. 選擇策略
簡單腳本、需要精細控制SQL:選擇 PyMySQL 或 mysql-connector-python。
Web應(yīng)用、復(fù)雜業(yè)務(wù)邏輯、希望代碼更Pythonic:選擇 SQLAlchemy ORM。
另外搭配便捷的MYSQL備份工具,可定時備份、異地備份,MYSQL導(dǎo)出導(dǎo)入??杀镜剡B接LINUX里的MYSQL,簡單便捷??梢源蟠蟮靥岣吖ぷ餍枢浮?/p>
以上就是Python操作MySQL的兩種方法詳解的詳細內(nèi)容,更多關(guān)于Python操作MySQL的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實現(xiàn)統(tǒng)計代碼行的方法分析
這篇文章主要介紹了Python實現(xiàn)統(tǒng)計代碼行的方法,結(jié)合實例形式分析了Python針對代碼行數(shù)的計算實現(xiàn)步驟與操作技巧,需要的朋友可以參考下2017-07-07
Python?hashlib模塊與哈希算法保護數(shù)據(jù)完整性教程
hashlib模塊為Python提供了一種簡便的方式來使用各種哈希算法,如MD5、SHA-1、SHA-256等,哈希函數(shù)廣泛用于密碼學(xué)、數(shù)據(jù)完整性驗證和安全存儲等領(lǐng)域2024-01-01
Flask框架運用Ajax實現(xiàn)輪詢動態(tài)繪圖
Ajax是異步JavaScript和XML可用于前后端交互,本文將通過Ajax輪詢獲取后端的數(shù)據(jù),前臺使用echart繪圖庫進行圖形的生成與展示,最后實現(xiàn)動態(tài)監(jiān)控內(nèi)存利用率的這個功能,需要的可以參考一下2022-11-11
Python Sql數(shù)據(jù)庫增刪改查操作簡單封裝
這篇文章主要為大家介紹了Python Sql數(shù)據(jù)庫增刪改查操作簡單封裝,感興趣的小伙伴們可以參考一下2016-04-04

