杰瑞科技汇

Python如何创建MySQL数据库?

  1. 使用 mysql-connector-python 驱动(推荐):这是官方提供的驱动,代码更清晰、更符合 Python 的风格,适合绝大多数场景。
  2. 使用 PyMySQL 驱动:这是一个非常流行的第三方驱动,语法与 mysql-connector-python 类似,也是一个不错的选择。

下面我将详细介绍这两种方法,并提供完整的代码示例和最佳实践。

Python如何创建MySQL数据库?-图1
(图片来源网络,侵删)

使用 mysql-connector-python (推荐)

这是 Oracle 官方为 MySQL 提供的 Python 驱动,功能稳定且支持良好。

第 1 步:安装驱动

你需要安装这个驱动,打开你的终端或命令提示符,运行以下命令:

pip install mysql-connector-python

第 2 步:编写 Python 脚本

创建一个 Python 文件(create_db.py),然后使用以下代码。

核心思路:

Python如何创建MySQL数据库?-图2
(图片来源网络,侵删)
  • 我们不能直接创建一个不存在的数据库,因为连接数据库本身就需要数据库名存在。
  • 最佳实践是:先以一个已存在的数据库(如 mysqlinformation_schema)进行连接,然后执行 CREATE DATABASE SQL 语句来创建新的数据库。
  • 创建成功后,我们再连接到新创建的数据库,并创建表。

完整代码示例

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()

如何运行

  1. 将代码中的 your_usernameyour_password 替换为你自己的 MySQL 用户名和密码。
  2. 保存文件为 create_db.py
  3. 在终端中运行: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()

重要注意事项和最佳实践

  1. 安全性与 SQL 注入

    Python如何创建MySQL数据库?-图3
    (图片来源网络,侵删)
    • 绝对不要使用 Python 的字符串格式化(如 f"CREATE DATABASE {user_input_db_name}")来拼接 SQL 语句,这极易受到 SQL 注入攻击。
    • 在上面的例子中,我们创建的数据库名是硬编码的,所以是安全的,如果数据库名需要来自用户输入,你应该使用参数化查询,但对于 CREATE DATABASE 这样的语句,参数化通常不适用,所以必须对输入进行严格的验证和清理。
  2. 使用 try...except...finally

    • 数据库操作可能会因为网络问题、权限不足、密码错误等原因失败。try...except 块可以捕获这些错误并打印友好的提示。
    • finally 块确保无论是否发生错误,数据库连接和游标都会被正确关闭,这是防止资源泄漏的关键。
  3. 关闭连接

    • 每次使用完数据库后,都必须关闭游标(cursor.close())和连接(connection.close()),忘记关闭连接会导致数据库服务器上的连接资源耗尽,使服务无法响应。
  4. 数据库和表命名规范

    • 使用反引号 ` (backtick) 将数据库名和表名括起来是一个好习惯,可以避免与 MySQL 的保留关键字(如 `order`, `key`)发生冲突,`CREATE TABLEorder`。
  5. 权限

    • 执行脚本的 MySQL 用户必须拥有 CREATE 权限,否则会失败。
特性 mysql-connector-python (官方) PyMySQL (第三方)
维护方 Oracle 社区
安装 pip install mysql-connector-python pip install PyMySQL
风格 面向对象,API 现代化 面向对象,API 类似
依赖 依赖 C 扩展(但已内置) 纯 Python 实现,无外部依赖
推荐度 首选,功能全面,与 MySQL 服务结合紧密 非常好,轻量级,易于安装

对于大多数项目,推荐使用 mysql-connector-python,两种方法都能很好地完成任务,选择哪一个主要取决于个人偏好或项目已有依赖。

分享:
扫描分享到社交APP
上一篇
下一篇