- 使用
mysql-connector-python驱动(推荐):这是官方提供的驱动,代码更清晰、更符合 Python 的风格,适合绝大多数场景。 - 使用
PyMySQL驱动:这是一个非常流行的第三方驱动,语法与mysql-connector-python类似,也是一个不错的选择。
下面我将详细介绍这两种方法,并提供完整的代码示例和最佳实践。

使用 mysql-connector-python (推荐)
这是 Oracle 官方为 MySQL 提供的 Python 驱动,功能稳定且支持良好。
第 1 步:安装驱动
你需要安装这个驱动,打开你的终端或命令提示符,运行以下命令:
pip install mysql-connector-python
第 2 步:编写 Python 脚本
创建一个 Python 文件(create_db.py),然后使用以下代码。
核心思路:

- 我们不能直接创建一个不存在的数据库,因为连接数据库本身就需要数据库名存在。
- 最佳实践是:先以一个已存在的数据库(如
mysql或information_schema)进行连接,然后执行CREATE DATABASESQL 语句来创建新的数据库。 - 创建成功后,我们再连接到新创建的数据库,并创建表。
完整代码示例
import mysql.connector
from mysql.connector import Error
def create_database_and_table():
"""
连接到 MySQL 服务器,创建一个新数据库,然后连接到该数据库并创建一个表。
"""
# --- 1. 连接到 MySQL 服务器 ---
# 注意:这里我们连接到 'mysql' 这个系统数据库(它通常总是存在的)
# 或者你也可以连接到 'information_schema'
connection = None
cursor = None
try:
# 替换为你的 MySQL 服务器信息
connection = mysql.connector.connect(
host='localhost', # 数据库主机地址
user='your_username', # 你的数据库用户名
password='your_password' # 你的数据库密码
)
if connection.is_connected():
db_info = connection.get_server_info()
print(f"成功连接到 MySQL 服务器,版本: {db_info}")
cursor = connection.cursor()
# --- 2. 创建新数据库 ---
# 定义要创建的数据库名
db_name = 'python_test_db'
# 使用 IF NOT EXISTS 可以防止数据库已存在时出错
create_db_query = f"CREATE DATABASE IF NOT EXISTS {db_name}"
cursor.execute(create_db_query)
print(f"数据库 '{db_name}' 创建成功或已存在。")
# --- 3. 连接到新创建的数据库并创建表 ---
# 关闭之前的连接,然后以新数据库名重新连接
connection.close()
# 连接到新创建的数据库
connection = mysql.connector.connect(
host='localhost',
user='your_username',
password='your_password',
database=db_name # 指定要连接的数据库
)
cursor = connection.cursor()
# --- 4. 在新数据库中创建表 ---
# 创建一个 'employees' 表
create_table_query = """
CREATE TABLE IF NOT EXISTS employees (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
hire_date DATE,
salary DECIMAL(10, 2)
)
"""
cursor.execute(create_table_query)
print(f"在数据库 '{db_name}' 中成功创建 'employees' 表。")
except Error as e:
print(f"发生错误: {e}")
finally:
# --- 5. 关闭连接 ---
# 确保在最后关闭游标和连接
if cursor:
cursor.close()
if connection and connection.is_connected():
connection.close()
print("MySQL 连接已关闭。")
# --- 运行函数 ---
if __name__ == "__main__":
create_database_and_table()
如何运行
- 将代码中的
your_username和your_password替换为你自己的 MySQL 用户名和密码。 - 保存文件为
create_db.py。 - 在终端中运行:
python create_db.py
如果一切顺利,你将看到类似以下的输出,并且你的 MySQL 服务器中会多出一个名为 python_test_db 的数据库,里面还有一个 employees 表。
使用 PyMySQL 驱动
PyMySQL 是另一个非常流行的纯 Python 实现的 MySQL 客户端库,它的用法与 mysql-connector-python 非常相似。
第 1 步:安装驱动
pip install PyMySQL
第 2 步:编写 Python 脚本
代码逻辑与第一种方法完全相同,只是导入的库和连接参数略有不同。
完整代码示例
import pymysql
from pymysql import MySQLError
def create_database_and_table_pymysql():
"""
使用 PyMySQL 创建数据库和表。
"""
connection = None
cursor = None
try:
# --- 1. 连接到 MySQL 服务器 ---
# 注意:这里不指定 database
connection = pymysql.connect(
host='localhost',
user='your_username',
password='your_password',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor # 可选:以字典形式返回结果
)
with connection.cursor() as cursor:
# --- 2. 创建新数据库 ---
db_name = 'python_test_db_pymysql'
create_db_query = f"CREATE DATABASE IF NOT EXISTS `{db_name}`"
# 使用反引号 ` 包裹数据库名,可以防止与 MySQL 保留关键字冲突
cursor.execute(create_db_query)
print(f"数据库 '{db_name}' 创建成功或已存在。")
# --- 3. 创建表 ---
# 选择要操作的数据库
cursor.execute(f"USE `{db_name}`")
create_table_query = """
CREATE TABLE IF NOT EXISTS products (
id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
stock INT DEFAULT 0
)
"""
cursor.execute(create_table_query)
print(f"在数据库 '{db_name}' 中成功创建 'products' 表。")
# 提交事务,对于 DDL 语句(如 CREATE, DROP, ALTER)通常自动提交,
# 但显式提交是好习惯
connection.commit()
except MySQLError as e:
print(f"发生错误: {e}")
if connection:
connection.rollback() # 发生错误时回滚
finally:
# --- 4. 关闭连接 ---
if connection:
connection.close()
print("MySQL 连接已关闭。")
# --- 运行函数 ---
if __name__ == "__main__":
create_database_and_table_pymysql()
重要注意事项和最佳实践
-
安全性与 SQL 注入:
(图片来源网络,侵删)- 绝对不要使用 Python 的字符串格式化(如
f"CREATE DATABASE {user_input_db_name}")来拼接 SQL 语句,这极易受到 SQL 注入攻击。 - 在上面的例子中,我们创建的数据库名是硬编码的,所以是安全的,如果数据库名需要来自用户输入,你应该使用参数化查询,但对于
CREATE DATABASE这样的语句,参数化通常不适用,所以必须对输入进行严格的验证和清理。
- 绝对不要使用 Python 的字符串格式化(如
-
使用
try...except...finally:- 数据库操作可能会因为网络问题、权限不足、密码错误等原因失败。
try...except块可以捕获这些错误并打印友好的提示。 finally块确保无论是否发生错误,数据库连接和游标都会被正确关闭,这是防止资源泄漏的关键。
- 数据库操作可能会因为网络问题、权限不足、密码错误等原因失败。
-
关闭连接:
- 每次使用完数据库后,都必须关闭游标(
cursor.close())和连接(connection.close()),忘记关闭连接会导致数据库服务器上的连接资源耗尽,使服务无法响应。
- 每次使用完数据库后,都必须关闭游标(
-
数据库和表命名规范:
- 使用反引号
`(backtick) 将数据库名和表名括起来是一个好习惯,可以避免与 MySQL 的保留关键字(如 `order`, `key`)发生冲突,`CREATE TABLEorder`。
- 使用反引号
-
权限:
- 执行脚本的 MySQL 用户必须拥有
CREATE权限,否则会失败。
- 执行脚本的 MySQL 用户必须拥有
| 特性 | mysql-connector-python (官方) |
PyMySQL (第三方) |
|---|---|---|
| 维护方 | Oracle | 社区 |
| 安装 | pip install mysql-connector-python |
pip install PyMySQL |
| 风格 | 面向对象,API 现代化 | 面向对象,API 类似 |
| 依赖 | 依赖 C 扩展(但已内置) | 纯 Python 实现,无外部依赖 |
| 推荐度 | 首选,功能全面,与 MySQL 服务结合紧密 | 非常好,轻量级,易于安装 |
对于大多数项目,推荐使用 mysql-connector-python,两种方法都能很好地完成任务,选择哪一个主要取决于个人偏好或项目已有依赖。
