Skip to content

Django 项目实战:配置 MySQL 数据库与数据迁移详解

在开发 Django Web 应用程序时,虽然默认的 SQLite 数据库对于开发和测试阶段非常方便,但在生产环境或需要更强大数据库功能的场景下,通常需要切换到更成熟的关系型数据库,如 MySQL。本文将详细阐述如何在 Django 项目中配置 MySQL 数据库,并重点介绍 Django 强大的数据迁移系统,帮助开发者顺利地将数据模型映射到 MySQL 数据库结构中。

环境准备:安装与设置

在开始配置 Django 连接 MySQL 之前,需要确保本地或服务器环境中已经正确安装并运行了 MySQL 服务。同时,还需要为 Django 项目创建一个专用的数据库和用户。可以通过 MySQL 命令行或图形化工具执行类似以下的 SQL 命令:

sql
-- 创建一个新的数据库,例如命名为 'myproject_db',并指定字符集为 utf8mb4
CREATE DATABASE myproject_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建一个新的数据库用户,例如 'myproject_user',并设置密码 'your_strong_password'
CREATE USER 'myproject_user'@'localhost' IDENTIFIED BY 'your_strong_password';

-- 授予该用户对新创建数据库的所有权限
GRANT ALL PRIVILEGES ON myproject_db.* TO 'myproject_user'@'localhost';

-- 刷新权限使更改生效
FLUSH PRIVILEGES;

请务必将 'myproject_db', 'myproject_user', 'localhost''your_strong_password' 替换为实际使用的名称、主机和密码。

除了 MySQL 服务本身,Django 与 MySQL 交互还需要一个 Python 数据库驱动程序。推荐使用 mysqlclient,它是 C 语言编写的 MySQLdb 的一个分支,性能较好。可以通过 pip 进行安装:

bash
pip install mysqlclient

如果在安装 mysqlclient 时遇到编译错误,可能需要先安装 MySQL 的开发库文件(例如在 Debian/Ubuntu 系统上是 libmysqlclient-dev,在 CentOS/RHEL 上是 mysql-devel)。另一种选择是使用纯 Python 实现的 PyMySQL,稍后会提及如何配置。

配置 Django 连接

完成环境准备后,下一步是修改 Django 项目的 settings.py 文件,告诉 Django 如何连接到新创建的 MySQL 数据库。找到文件中的 DATABASES 配置项,将其修改为类似如下内容:

python
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'myproject_db',        # 替换为你的数据库名
        'USER': 'myproject_user',      # 替换为你的数据库用户名
        'PASSWORD': 'your_strong_password', # 替换为你的数据库密码
        'HOST': 'localhost',           # 数据库服务器地址,本地通常是 'localhost' 或 '127.0.0.1'
        'PORT': '3306',                # MySQL 默认端口,如果修改过请相应调整
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", # 可选:设置 SQL 模式
            'charset': 'utf8mb4', # 推荐使用 utf8mb4 以支持更广泛的字符集,包括 emoji
        },
    }
}

这里 ENGINE 指定了使用 Django 内置的 MySQL 后端。NAME, USER, PASSWORD, HOST, PORT 则分别对应之前创建数据库时的信息。OPTIONS 字典可以用来传递额外的连接参数,例如设置字符集为 utf8mb4 是一个很好的实践,可以避免很多潜在的编码问题。

选择 MySQL 驱动 (PyMySQL)

如果因为某些原因无法安装 mysqlclient,或者偏好纯 Python 实现的驱动,可以选择 PyMySQL。首先需要安装它:

bash
pip install PyMySQL

然后,需要在项目的根 __init__.py 文件(通常与 settings.py 在同一个目录下)或者 settings.py 的顶部添加以下代码,让 Django 知道使用 PyMySQL 作为 MySQL 驱动:

python
import pymysql
pymysql.install_as_MySQLdb()

完成此步骤后,settings.pyDATABASES 配置的 ENGINE 仍然保持 'django.db.backends.mysql' 不变,Django 会自动通过上述代码找到并使用 PyMySQL

理解并执行数据迁移

Django 的数据迁移系统是一个强大的功能,它允许开发者通过 Python 代码(模型定义)来管理数据库模式(表结构)的演变。当你修改了 models.py 文件(例如添加、删除、修改模型或字段)后,可以通过迁移命令将这些更改同步到数据库中。

步骤1:生成迁移文件 (makemigrations)

当对 Django 应用中的模型进行了更改后,需要运行 makemigrations 命令。这个命令会检查模型相较于上一次迁移状态的变化,并生成一个新的迁移文件,该文件包含了将数据库结构从旧状态更新到新状态所需的 Python 代码。

bash
python manage.py makemigrations <app_name>

其中 <app_name> 是你修改了模型的那个应用的名称。如果省略 <app_name>,Django 会检查所有应用的模型变化。执行成功后,会在对应应用的 migrations 目录下生成一个新的 Python 文件,例如 0002_auto_xxxxxxxx_xxxx.py。建议查看生成的迁移文件内容,了解它具体会执行哪些数据库操作。

步骤2:应用迁移 (migrate)

生成迁移文件后,数据库的结构尚未发生改变。需要运行 migrate 命令来实际执行迁移文件中定义的操作,将更改应用到数据库。

bash
python manage.py migrate

此命令会查找所有应用中尚未应用的迁移文件,并按照依赖顺序依次执行它们。对于首次配置数据库(无论是 SQLite 还是 MySQL),运行 migrate 会创建 Django 内置应用(如 auth, admin, contenttypes, sessions 等)所需的表结构,以及你自己应用中所有已生成的迁移对应的表结构。

下面的 Mermaid 图展示了配置和迁移的基本流程:

验证数据库连接

配置完成并执行了初始迁移后,可以通过多种方式验证数据库连接是否成功。最简单的方法是尝试运行 Django 开发服务器:

bash
python manage.py runserver

如果服务器能够正常启动且没有报数据库连接错误,说明基本配置是成功的。更进一步,可以尝试创建一个超级用户:

bash
python manage.py createsuperuser

如果能够成功提示输入用户名、邮箱和密码,并将用户信息写入数据库,则表明数据库连接和写入权限都已正确配置。

注意事项

配置 MySQL 时,字符集问题是一个常见的坑。强烈建议在创建数据库时就指定 utf8mb4 字符集,并在 settings.pyOPTIONS 中也明确指定 charset: 'utf8mb4',这样可以最大限度地兼容各种字符,包括 Emoji 表情。另外,确保数据库用户的权限设置正确,至少拥有对项目数据库的读写和修改表结构的权限。驱动安装过程中遇到的问题通常与系统环境和依赖库有关,需要根据具体错误信息查找解决方案。

小结

将 Django 项目的数据库从默认的 SQLite 切换到 MySQL 是一个常见的需求。核心步骤包括准备 MySQL 环境、安装合适的 Python 驱动、修改 settings.py 中的 DATABASES 配置项以指向 MySQL 实例。完成配置后,利用 Django 的数据迁移系统,通过 makemigrations 生成迁移文件记录模型变化,再通过 migrate 命令将这些变化应用到 MySQL 数据库中,从而实现模型与数据库结构的同步。遵循这些步骤,可以确保 Django 项目顺利地运行在 MySQL 数据库之上。

参考资料