构建现代 Web 应用程序通常涉及大量数据。 在开发和生产过程中管理这些数据(数据库)可能很多。
如果有多个开发人员和多个必须手动实施更改的环境,则尤其如此。
数据库迁移可帮助开发人员跨多个环境和开发人员轻松管理这些更改。
在本篇文章中我们将介绍如下几个方面:
- 什么是数据库迁移。
- 如何开始使用 Phinx 在 PHP 中进行数据库迁移。
- 如何管理数据库中的表。
本文适用于具有基本 PHP 知识的读者。 它将帮助大家学习轻松(并且更好地)管理自己的数据库。
什么是数据库迁移
基本上,迁移包含我们希望对数据库进行的更改。 这些更改可能是创建或删除表、在表中添加或删除某些字段、更改列类型等等。
这些文件使得跨多个系统进行相同的更改变得容易,因为任何拥有这些文件的人都可以运行它们,并更新他们的数据库。
因此,在现实生活场景中,团队中的一些开发人员可以对 users 表进行更改,以允许性别字段接受比默认的男性和女性选项更多的选项,也许还有第三个选项。
进行此更改后,开发人员会创建迁移。 此迁移包括他们对数据库所做的更改——在本例中是对表中列的更改——其他开发人员可以通过运行迁移轻松地对他们自己的本地数据库进行此更改。
迁移就像数据库的版本控制,允许我们的团队定义和共享应用程序的数据库模式定义。 如果我们曾经不得不告诉队友在从源代码管理中提取更改后手动将一列添加到他们的本地数据库架构中,那么就遇到了数据库迁移解决的问题。 - Laravel
许多流行的 Web 框架已经内置了对迁移的支持。但在本文中,我们将探索在原生 PHP 中使用迁移。
什么是 Phinx?
Phinx 是一个 PHP 库,可让我们轻松管理 PHP 应用程序的数据库迁移。 - Phinx
无论我们是否使用 PHP 框架,Phinx 都可以轻松管理迁移。 它也很容易安装(我们稍后会看到)。
它附带了几个命令,使操作更容易。 它是完全可定制的(我们可以用它做任何想做的事情?)。 它也适用于多种环境,这意味着我们可以进行一些生产迁移、测试迁移和开发迁移。
Phinx 安装
我们可以使用 composer 将 Phinx 添加到任何 PHP 项目中。
$ mkdir php-migrations
$ cd php-migrations
$ composer init
第一个命令在当前目录 php-migrations
中创建一个文件夹,第二个命令进入其中。 最后一个命令启动一个交互式 shell。
按照提示,按要求填写详细信息(默认值即可)。 我们可以设置项目描述、作者姓名(或贡献者姓名)、依赖项的最低稳定性、项目类型、许可证,并定义所需的依赖项。
当进入依赖项部分时,将 phinx 包 robmorgan/phinx
安装为依赖项。
接受其他默认值并继续生成 composer.json
文件。 生成的文件当前应如下所示:
{
"name": "jiyik/php-migrations",
"description": "A simple tutorial on how to use and manage migrations in PHP applications.",
"type": "project",
"require": {
"robmorgan/phinx": "^0.12.10"
},
"license": "ISC",
"autoload": {
"psr-4": {
"Zubs\\": "src/"
}
},
"authors": [
{
"name": "jiyik",
"email": "1028256334@qq.com"
}
]
}
初始化 Phinx
安装 Phinx 后,需要对其进行初始化。 我们可以使用安装在 vendor
文件夹中的二进制文件轻松完成此操作。
$ ./vendor/bin/phinx init
这会将 phinx 的配置文件创建为 PHP 文件。 它也可以创建为 JSON 文件。 我更喜欢 JSON 进行配置,所以我将使用 JSON 格式。
$ ./vendor/bin/phinx init --format=json
这是默认配置文件的样子:
{
"paths": {
"migrations": "%%PHINX_CONFIG_DIR%%/db/migrations",
"seeds": "%%PHINX_CONFIG_DIR%%/db/seeds"
},
"environments": {
"default_migration_table": "phinxlog",
"default_environment": "development",
"production": {
"adapter": "mysql",
"host": "localhost",
"name": "production_db",
"user": "root",
"pass": "",
"port": 3306,
"charset": "utf8"
},
"development": {
"adapter": "mysql",
"host": "localhost",
"name": "development_db",
"user": "root",
"pass": "",
"port": 3306,
"charset": "utf8"
},
"testing": {
"adapter": "mysql",
"host": "localhost",
"name": "testing_db",
"user": "root",
"pass": "",
"port": 3306,
"charset": "utf8"
}
},
"version_order": "creation"
}
在这个配置文件中,请注意 Phinx 如何期望我们默认拥有一个 db/migrations
路径(用于我们的迁移)。 如果愿意,我们可以改变它,但我认为这很好,我会保留它。
$ mkdir db && db/migrations
Phinx 还附带了用于不同操作的命令,使其更易于在我们的项目中使用。
如何创建迁移
Phinx 使用类进行迁移。 要创建一个新的迁移(例如,创建一个 posts 表),请使用带有迁移名称的 create
命令。
$ ./vendor/bin/phinx create PostsTableMigration
这会在之前创建的 db/migrations 目录中创建一个 20220328122134_posts_table_migration.php 文件。 此文件使用 YYYYMMDDHHMMSS_my_new_migration.php 格式命名。 在这种格式中,前 14 个字符 YYYYMMDDHHMMSS 表示当前时间戳。
20220328122134_posts_table_migration.php 目前看起来像这样:
<?php
declare(strict_types=1);
use Phinx\Migration\AbstractMigration;
final class PostsTableMigration extends AbstractMigration
{
public function change(): void
{
}
}
该文件(以及使用 Phinx 创建的所有其他迁移)继承了 Phinx\Migration\AbstractMigration
类。 此类具有与数据库交互所需的所有方法。
此迁移文件还包括更改方法。 这种方法最近在 0.2.0 版本中被引入到 Phinx,以实现 Phinx 的可逆迁移思想。
这些迁移文件只有一种 change 方法,其中包含执行某些操作的逻辑,让 Phinx 弄清楚如何扭转它。 而不是传统的使用 up 和 down 两种方法来创建和反转动作。
Phinx 仍然允许我们使用 up 和 down 方法。 但是当它们一起使用时,它会优先考虑 change 方法。 从而略过了其他方法。
如何管理数据表
数据表是构建结构化数据库的基础,也是 Phinx 提供的最重要的部分。
我们可以使用 PHP 代码和 Phinx 轻松管理数据库表。 Phinx 提供了一个强大的 table()
方法。 此方法检索 Table 对象的实例。
如何创建数据表
使用 Phinx 创建表非常容易。 使用带有表名的 table()
方法创建 Table 对象的新实例。
$table = $this->table('posts');
接下来,我们可以添加列及其设置。
$table->addColumn('title', 'string', ['limit' => 20])
->addColumn('body', 'text')
->addColumn('cover_image', 'string')
->addTimestamps()
->addIndex(['title'], ['unique' => true]);
在这里,我们创建了列 title、body、cover_image、created_at 和 updated_at。 还将标题的类型设置为包含 20 个或更少字符的字符串。
将正文设置为一个文本字段,因此它可以容纳很长的帖子。 cover_image 也是一个字符串字段,它使用字符串的默认大小 (255)。
created_at 和 updated_at 字段是在 addTimestamps() 方法中自动生成的时间戳。
最后,我将 title 字段设置为 unique
(就像在真实博客中一样)。
我们可以通过检查有效列类型来获取所有可用的列类型。 还可以通过选中有效列选项来获取所有可用的列选项。
最后,我们可以说应该使用 create
方法创建数据库表。
$table->create();
最后,我们的迁移文件的 change 方法应如下所示:
public function change(): void
{
$table = $this->table('posts');
$table->addColumn('title', 'string', ['limit' => 20])
->addColumn('body', 'text')
->addColumn('cover_image', 'string')
->addTimestamps()
->addIndex(['title'], ['unique' => true]);
$table->create();
}
我们现在可以运行此迁移来创建我们的表。
如何运行迁移
创建迁移后,下一步是在数据库中强制执行这些所需的更改。 运行迁移实际上会强制执行这些更改。
$ ./vendor/bin/phinx migrate
执行完成之后,如果查看数据库 GUI 工具,我们会注意到创建的 posts 表带有一个附加字段,即 id 字段。 默认情况下,此字段也是主键字段。 它还会自动递增。
我们可以通过将其他字段指定为主字段或将 id 字段映射到所需的主字段来将主键更改为其他键。 后者包括普通 id 字段的自动递增能力。
$table = $this->table('posts', [
'id' => false,
'primary_key' => ['posts_key']
]);
$table = $this->table('posts', [
'id' => 'posts_key',
]);
在第一种方法中,要使用的主键必须是表上的列(它不是自动创建的)。
我们还可以设置要运行迁移的环境。
$ ./vendor/bin/phinx migrate -e testing
如何反向迁移
逆向迁移可以通过运行 down 方法来实现。 这与向上迁移相反。 先前创建的表将被删除,添加的列将被删除,并且数据库将返回到其初始迁移前状态。
$ ./vendor/bin/phinx rollback
如何检查迁移状态
随着应用程序大小的增加,预计我们的数据库迁移将会增加。 因此,在某些时候,我们可能希望检查迁移的状态,以了解哪些已运行,哪些尚未运行。
$ ./vendor/bin/phinx status
如何删除表
我们可以轻松地在 Table 对象上使用 drop 方法,然后使用 save 方法来持久化更改。
$this->table('posts')->drop()->save();
如何重命名表
$table = $this->table('posts');
$table->rename('articles')
->update();
要删除表,首先请检索该表。 然后使用带有新名称的 rename 方法,然后使用 update 方法来持久化此更改。
如何改变表的主键
我们还可以非常轻松地更改表的主键。
$table = $this->table('posts');
$table->changePrimaryKey('new_primary_key');
$table->update();
现在我们知道如何在 PHP 应用程序中设置迁移。