杰瑞科技汇

Python3中如何安装使用mysql-python?

mysql-python 这个库的官方名称是 MySQLdb,它是 Python 连接 MySQL 数据库最古老、最经典的库之一。

Python3中如何安装使用mysql-python?-图1
(图片来源网络,侵删)

有一个非常关键的问题:MySQLdb 官方版本并不支持 Python 3,它最初是为 Python 2 开发的,虽然社区有一些第三方分支(如 mysqlclient)支持 Python 3,但它们安装起来可能会比较麻烦,尤其是在 macOS 和 Windows 系统上,因为它们需要编译 MySQL 的 C 语言扩展,依赖系统环境。

在现代 Python 3 开发中,我们强烈推荐使用以下两个库中的一个,它们是 mysql-python 的现代替代品,并且对 Python 3 有非常好的支持:

  1. mysql-connector-python (官方推荐)
  2. PyMySQL (纯 Python 实现,安装简单)

下面我将分别介绍这三个库(mysql-python/MySQLdbmysql-connector-pythonPyMySQL),并提供完整的代码示例。


mysql-python (即 MySQLdb)

这是最传统的库,但不推荐在新项目中使用,特别是如果你使用 Python 3 的话。

Python3中如何安装使用mysql-python?-图2
(图片来源网络,侵删)

为什么不推荐?

  • Python 3 兼容性差:官方版不支持,社区版(如 mysqlclient)安装复杂。
  • 依赖问题:编译时需要 MySQL 的开发库(如 libmysqlclient-dev on Linux, mysql-devel on CentOS, 以及 Xcode Command Line Tools on macOS),新手很容易在安装时遇到各种错误。

如何尝试安装(仅限 Linux 或使用 Homebrew 的 macOS)

# 尝试安装社区版 mysqlclient
pip install mysqlclient

如果失败,通常需要先安装系统依赖,例如在 Ubuntu/Debian 上:

sudo apt-get update
sudo apt-get install python3-dev libmysqlclient-dev

在 CentOS/RHEL 上:

sudo yum install python3-devel mysql-devel

在 macOS 上(需要先安装 Xcode Command Line Tools 和 MySQL):

brew install mysql
pip install mysqlclient

代码示例(假设你成功安装了 mysqlclient

import MySQLdb
# --- 数据库连接信息 ---
DB_HOST = 'localhost'
DB_USER = 'your_username'
DB_PASS = 'your_password'
DB_NAME = 'your_database'
try:
    # 1. 建立连接
    # connect() 返回一个连接对象
    conn = MySQLdb.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASS, db=DB_NAME)
    # 2. 创建一个游标对象
    # 游标用于执行 SQL 语句并获取结果
    cursor = conn.cursor()
    # 3. 执行 SQL 查询
    # 使用 %s 作为占位符,防止 SQL 注入
    sql_query = "SELECT id, name, email FROM users WHERE id = %s"
    cursor.execute(sql_query, (1,))  # 注意:元组形式 (1,)
    # 4. 获取查询结果
    # fetchone() 获取单行结果
    user = cursor.fetchone()
    if user:
        print(f"ID: {user[0]}, Name: {user[1]}, Email: {user[2]}")
    # 5. 执行插入操作
    insert_sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
    new_user_data = ("Alice", "alice@example.com")
    cursor.execute(insert_sql, new_user_data)
    # 6. 提交事务
    # 对于写操作(INSERT, UPDATE, DELETE),必须提交才能生效
    conn.commit()
    print("新用户插入成功!")
    # 7. 关闭游标和连接
    cursor.close()
    conn.close()
except MySQLdb.Error as e:
    # 如果发生错误,回滚事务
    if 'conn' in locals():
        conn.rollback()
    print(f"数据库错误: {e}")

mysql-connector-python (官方推荐)

这是 Oracle 官方维护的 Python 驱动,它功能全面,支持 Python 3,并且是官方支持的“正统”选择。

Python3中如何安装使用mysql-python?-图3
(图片来源网络,侵删)

安装

pip install mysql-connector-python

代码示例

API 风格与 MySQLdb 非常相似,但对象和方法名略有不同。

import mysql.connector
from mysql.connector import Error
# --- 数据库连接信息 ---
DB_CONFIG = {
    'host': 'localhost',
    'user': 'your_username',
    'password': 'your_password',
    'database': 'your_database'
}
try:
    # 1. 建立连接
    # connect() 返回一个连接对象
    conn = mysql.connector.connect(**DB_CONFIG)
    if conn.is_connected():
        print("成功连接到数据库")
        # 2. 创建一个游标对象
        cursor = conn.cursor()
        # 3. 执行 SQL 查询
        sql_query = "SELECT id, name, email FROM users WHERE id = %s"
        cursor.execute(sql_query, (1,))
        # 4. 获取查询结果
        # fetchone() 获取单行结果
        user = cursor.fetchone()
        if user:
            print(f"ID: {user[0]}, Name: {user[1]}, Email: {user[2]}")
        # 5. 执行插入操作
        insert_sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
        new_user_data = ("Bob", "bob@example.com")
        cursor.execute(insert_sql, new_user_data)
        # 6. 提交事务
        conn.commit()
        print(f"成功插入 {cursor.rowcount} 行数据")
        # 7. 关闭游标和连接
        cursor.close()
        conn.close()
except Error as e:
    print(f"数据库错误: {e}")
finally:
    # 确保连接被关闭
    if 'conn' in locals() and conn.is_connected():
        conn.close()
        print("数据库连接已关闭")

PyMySQL (纯 Python 实现)

PyMySQL 是一个纯 Python 实现的 MySQL 客户端,这意味着它不需要编译 C 语言扩展,安装极其简单,跨平台兼容性非常好。

安装

pip install PyMySQL

代码示例

PyMySQL 的 API 风格与 Python 内置的 sqlite3 模块非常相似,非常直观。

import pymysql
from pymysql import MySQLError
# --- 数据库连接信息 ---
DB_CONFIG = {
    'host': 'localhost',
    'user': 'your_username',
    'password': 'your_password',
    'database': 'your_database',
    'charset': 'utf8mb4', # 推荐使用 utf8mb4
    'cursorclass': pymysql.cursors.DictCursor # 让游标返回字典,更方便
}
try:
    # 1. 建立连接
    # connect() 返回一个连接对象
    conn = pymysql.connect(**DB_CONFIG)
    with conn.cursor() as cursor:
        # 2. 执行 SQL 查询
        sql_query = "SELECT id, name, email FROM users WHERE id = %s"
        cursor.execute(sql_query, (1,))
        # 3. 获取查询结果
        # fetchone() 获取单行结果,由于使用了 DictCursor,结果是字典
        user = cursor.fetchone()
        if user:
            print(f"ID: {user['id']}, Name: {user['name']}, Email: {user['email']}")
        # 4. 执行插入操作
        insert_sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
        new_user_data = ("Charlie", "charlie@example.com")
        cursor.execute(insert_sql, new_user_data)
        # 5. 提交事务
        conn.commit()
        print(f"成功插入 {cursor.rowcount} 行数据")
except MySQLError as e:
    print(f"数据库错误: {e}")
    # 如果发生错误,回滚事务
    if 'conn' in locals():
        conn.rollback()
finally:
    # 6. 关闭连接
    if 'conn' in locals():
        conn.close()
        print("数据库连接已关闭")

注意PyMySQLwith conn.cursor() 语句是一个非常 Pythonic 的写法,它能确保游标在代码块执行完毕后自动关闭,即使发生异常也是如此。


总结与对比

特性 mysql-python (MySQLdb) mysql-connector-python (官方) PyMySQL
维护方 社区 (非官方) Oracle (官方) 社区
Python 3 支持 差 (需用 mysqlclient 分支) **好
分享:
扫描分享到社交APP
上一篇
下一篇