Python访问MySQL全流程实战指南
一、环境准备
- 安装MySQL服务
需提前安装MySQL数据库并创建测试数据库(如test_db),建议通过命令行或图形化工具(如phpMyAdmin)完成。 - 安装Python驱动
pymysql库为纯Python实现,兼容性最佳。
使用pip安装pymysql库:
pip install pymysql
二、建立数据库连接
- 连接参数说明
参数名 | 说明 | 示例值 |
host | 数据库服务器地址(本地用localhost) | 127.0.0.1 |
port | 端口号(默认3306) | 3306 |
user | 用户名 | root |
password | 密码 | 123456 |
database | 要连接的数据库名 | test_db |
- 代码示例
import pymysql
conn = pymysql.connect(
host="localhost",
user="root",
password="123456",
database="test_db",
charset="utf8mb4" # 支持Emoji和特殊字符
)
cursor = conn.cursor()
关键点:charset="utf8mb4"避免中文乱码,建议使用with语句自动管理连接。
三、基础CRUD操作
- 创建数据表
使用IF NOT EXISTS避免重复创建表。
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT,
email VARCHAR(100) UNIQUE
)
"""
cursor.execute(create_table_sql)
conn.commit()
- 插入数据
insert_sql = "INSERT INTO users (name, age, email) VALUES (%s, %s, %s)"
data = ("张三", 25, "zhangsan@example.com")
cursor.execute(insert_sql, data)
conn.commit()
注意:修改数据需调用commit(),失败时用rollback()回滚。
- 查询数据
结果以元组形式返回,可通过索引或字段名访问。
select_sql = "SELECT * FROM users WHERE age > %s"
cursor.execute(select_sql, (20,))
results = cursor.fetchall()
for row in results:
print(f"ID: {row[0]}, 姓名: {row[1]}, 年龄: {row[2]}")
- 更新与删除
参数化防止SQL注入。
# 更新数据
update_sql = "UPDATE users SET age = %s WHERE name = %s"
cursor.execute(update_sql, (30, "张三"))
conn.commit()
# 删除数据
delete_sql = "DELETE FROM users WHERE age < %s"
cursor.execute(delete_sql, (20,))
conn.commit()
四、事务与异常处理
- 事务特性(ACID)
- 原子性:操作要么全部成功,要么全部失败
- 一致性:数据始终有效
- 隔离性:并发操作互不干扰
- 持久性:提交后数据永久保存。
- 事务代码示例
适用于转账等对数据操作有极高要求的关键操作。
try:
conn.begin()
cursor.execute("UPDATE account SET balance = balance - 100 WHERE user = 'A'")
cursor.execute("UPDATE account SET balance = balance + 100 WHERE user = 'B'")
conn.commit()
except Exception as e:
conn.rollback()
print(f"事务失败:{e}")
五、高级技巧
- 使用ORM简化操作
推荐SQLAlchemy库,支持将查询结果转为DataFrame,以提升开发效率:
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://user:pass@host/db")
df = pd.read_sql("SELECT * FROM users", engine)
- 性能优化
- 批量插入:
data = [("李四", 30, "lisi@example.com")] * 1000
cursor.executemany(insert_sql, data)
conn.commit()
- 分页查询:LIMIT 10 OFFSET 20
- 连接池:使用DBUtils库管理连接。
六、完整示例代码
import pymysql
class MySQLHelper:
def __init__(self, config):
self.config = config
def __enter__(self):
self.conn = pymysql.connect(**self.config)
return self.conn.cursor()
def __exit__(self, exc_type, exc_val, exc_tb):
self.conn.close()
# 使用示例
config = {
"host": "localhost",
"user": "root",
"password": "123456",
"database": "test_db",
"charset": "utf8mb4"
}
with MySQLHelper(config) as cursor:
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR(50))")
cursor.execute("INSERT INTO users (name) VALUES (%s)", ("王五",))
优势:自动管理连接生命周期,代码简洁易读。
总结
通过以上步骤可系统掌握Python与MySQL的基础交互。实际开发中建议结合索引优化、慢查询分析等进阶技术提升性能。
上一篇:MySQL数据库语句