python mysql(建议收藏)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
前言
在当今数据驱动的时代,Python 和 MySQL 的组合已成为开发者的“黄金搭档”。Python 凭借其简洁优雅的语法,成为后端开发、数据分析和自动化脚本的首选语言;而 MySQL 作为开源关系型数据库,以高效稳定著称。两者结合,既能快速搭建数据应用,又能实现复杂的数据存储与查询。无论是构建个人博客、电商系统,还是处理海量数据,掌握 Python MySQL 的开发技能都至关重要。本文将从零开始,通过实例和比喻,带领读者逐步掌握这一技术栈的核心知识。
一、Python 连接 MySQL 的准备工作
1.1 安装 MySQL 数据库
安装 MySQL 的过程如同准备一个“数据仓库”。对于 Windows 用户,可以通过官方安装包完成;Linux 用户则可通过命令行安装。安装完成后,需启动 MySQL 服务并创建用户及数据库。例如:
CREATE DATABASE my_database;
CREATE USER 'my_user'@'localhost' IDENTIFIED BY 'my_password';
GRANT ALL PRIVILEGES ON my_database.* TO 'my_user'@'localhost';
1.2 安装 Python 的 MySQL 驱动
Python 需借助第三方库 mysql-connector-python
或 PyMySQL
与 MySQL 交互。安装方法如下:
pip install mysql-connector-python
这两个库如同“翻译官”,将 Python 代码转换为 MySQL 可理解的指令。
1.3 第一个连接示例
通过代码连接数据库是第一步。以下代码展示了如何建立连接并执行简单查询:
import mysql.connector
config = {
"host": "localhost",
"user": "my_user",
"password": "my_password",
"database": "my_database"
}
cnx = mysql.connector.connect(**config)
cursor = cnx.cursor()
query = "SELECT NOW()"
cursor.execute(query)
for (current_time,) in cursor:
print("当前时间:", current_time)
cursor.close()
cnx.close()
这段代码如同“钥匙”,打开数据库的大门后,执行指令并获取结果。
二、基础操作:CRUD 的实现
2.1 数据表的创建(Create)
创建数据表如同搭建“数据积木”。以下示例创建了一个用户表:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
AUTO_INCREMENT
:自动增长的主键,如同给每个数据行贴上唯一标签。UNIQUE
:确保邮箱地址不重复,类似图书馆的“唯一索引”。
2.2 数据插入(Insert)
插入数据如同往表格中“填数据”。以下代码演示了如何批量插入用户信息:
users = [
("Alice", "alice@example.com"),
("Bob", "bob@example.com")
]
insert_query = (
"INSERT INTO users (name, email) "
"VALUES (%s, %s)"
)
cursor.executemany(insert_query, users)
cnx.commit() # 提交事务
executemany()
方法如同“批量快递员”,一次性处理多个数据。
2.3 数据查询(Read)
查询数据如同在图书馆“检索书籍”。以下代码展示了如何筛选特定条件的数据:
select_query = (
"SELECT * FROM users "
"WHERE email LIKE '%example.com'"
)
cursor.execute(select_query)
for (user_id, name, email, created_at) in cursor:
print(f"ID: {user_id}, 邮箱: {email}")
LIKE
关键字支持模糊查询,%
是通配符,如同“模糊搜索的放大镜”。
2.4 数据更新(Update)
更新数据如同给图书“贴新标签”。以下代码将 Alice 的邮箱更新为新地址:
update_query = (
"UPDATE users "
"SET email = %s "
"WHERE name = %s"
)
cursor.execute(update_query, ("alice_new@example.com", "Alice"))
cnx.commit()
2.5 数据删除(Delete)
删除数据如同从图书馆“移除过期书籍”:
delete_query = "DELETE FROM users WHERE name = %s"
cursor.execute(delete_query, ("Bob",))
cnx.commit()
注意:元组单元素时需加逗号,否则会报错。
三、进阶技巧:事务与游标
3.1 事务管理:银行转账的启示
事务(Transaction)是确保数据一致性的“安全网”。例如,银行转账需要保证:
- 扣除 A 的金额;
- 增加 B 的金额。
若步骤 1 成功但步骤 2 失败,数据库需自动回滚,避免资金丢失。
代码示例:
try:
# 开始事务
cnx.start_transaction()
# 扣除 A 的金额
cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1")
# 增加 B 的金额
cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2")
# 提交事务
cnx.commit()
except Exception as e:
# 回滚事务
cnx.rollback()
print("事务失败,已回滚:", str(e))
3.2 游标:数据的“导航仪”
游标(Cursor)是遍历查询结果的指针,支持多种模式:
- 默认模式:逐行获取数据。
- 预获取模式:
fetchmany()
可批量获取。 - 缓冲区控制:通过
buffered=True
避免重复读取。
示例:
cursor = cnx.cursor(buffered=True)
cursor.execute("SELECT * FROM users")
print(cursor.fetchmany(2)) # 获取前两条
print(cursor.fetchone()) # 获取下一条
四、错误处理与性能优化
4.1 异常捕获:程序的“安全气囊”
数据库操作可能出现连接失败、语法错误等问题。通过 try-except
捕获异常:
try:
cursor.execute("SELECT * FROM non_existing_table")
except mysql.connector.Error as err:
print("错误:", err)
finally:
# 确保连接关闭
if cnx.is_connected():
cursor.close()
cnx.close()
4.2 参数化查询:防止 SQL 注入
直接拼接 SQL 语句可能引发安全漏洞,例如:
user_input = "'; DROP TABLE users; --" # 恶意输入
query = f"SELECT * FROM users WHERE name = '{user_input}'"
safe_query = "SELECT * FROM users WHERE name = %s"
cursor.execute(safe_query, (user_input,))
4.3 索引优化:加速查询的“高速公路”
为高频查询字段添加索引,如同为书籍添加“索引标签”:
ALTER TABLE users ADD INDEX idx_email (email);
五、实战案例:用户管理系统
5.1 系统设计
设计一个简单的用户管理系统,包含以下功能:
- 注册用户;
- 登录验证;
- 查询用户信息。
5.2 完整代码示例
import mysql.connector
from datetime import datetime
class UserManager:
def __init__(self):
self.cnx = mysql.connector.connect(
host="localhost",
user="my_user",
password="my_password",
database="my_database"
)
self.cursor = self.cnx.cursor()
def create_table(self):
create_table_query = (
"CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)"
)
self.cursor.execute(create_table_query)
def register(self, username, password):
insert_query = (
"INSERT INTO users (username, password) "
"VALUES (%s, %s)"
)
try:
self.cursor.execute(insert_query, (username, password))
self.cnx.commit()
print("注册成功!")
except mysql.connector.Error as err:
print("注册失败:", err)
def login(self, username, password):
select_query = (
"SELECT * FROM users "
"WHERE username = %s AND password = %s"
)
self.cursor.execute(select_query, (username, password))
user = self.cursor.fetchone()
if user:
print(f"登录成功!用户 ID: {user[0]}")
else:
print("用户名或密码错误!")
def close(self):
self.cursor.close()
self.cnx.close()
if __name__ == "__main__":
manager = UserManager()
manager.create_table()
# 测试注册
manager.register("john_doe", "secure_password123")
# 测试登录
manager.login("john_doe", "secure_password123")
manager.close()
六、结论
通过本文的学习,读者已掌握了从 Python 连接 MySQL 到实现完整系统的全流程。Python MySQL 的组合不仅简化了开发流程,还提供了强大的数据管理能力。无论是处理简单查询还是复杂事务,合理使用游标、索引和事务管理,都能显著提升应用的性能与稳定性。建议读者通过以下步骤深入实践:
- 尝试扩展用户管理系统,添加更多功能(如密码加密、数据导出);
- 优化现有代码,使用连接池(
mysql-connector-python
的pooling
功能)提升并发性能; - 探索 MySQL 的高级特性,如视图、存储过程和数据库复制。
掌握 Python MySQL,如同拥有了构建数据驱动应用的“瑞士军刀”。从今天起,动手实践,让代码与数据共同讲述故事吧!