python mysql(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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-pythonPyMySQL 与 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)是确保数据一致性的“安全网”。例如,银行转账需要保证:

  1. 扣除 A 的金额;
  2. 增加 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 的组合不仅简化了开发流程,还提供了强大的数据管理能力。无论是处理简单查询还是复杂事务,合理使用游标、索引和事务管理,都能显著提升应用的性能与稳定性。建议读者通过以下步骤深入实践:

  1. 尝试扩展用户管理系统,添加更多功能(如密码加密、数据导出);
  2. 优化现有代码,使用连接池(mysql-connector-pythonpooling 功能)提升并发性能;
  3. 探索 MySQL 的高级特性,如视图、存储过程和数据库复制。

掌握 Python MySQL,如同拥有了构建数据驱动应用的“瑞士军刀”。从今天起,动手实践,让代码与数据共同讲述故事吧!

最新发布