前言 通常情况下我们要创建 MySQL 数据库的表需要手动创建 SQL 语句。
然而这样一方面是很不方便,另一方面也不安全,如果修改表结构的时候不小心改错了,就会造成无法挽回的后果,而且最关键的是还不知道是谁干的!
之前上班的时候同事就遇到这种情况,有一个同事不小心删了另一个同事要用的表,结果不言而喻……
Phinx 官方网站:https://book.cakephp.org/phinx/0/en/install.html
Phinx 是一个数据库迁移插件,使用它可以通过 PHP 代码来创建表或者修改表结构。
如此一来就不需要手动使用 SQL 语句去修改数据库了。
安装 Phinx 使用命令:require robmorgan/phinx
完成安装后,再执行 vendor/bin/phinx init
:
1 2 3 4 /www/blog# vendor/bin/phinx init Phinx by CakePHP - https://phinx.org. created /www/blog/phinx.php
可以发现它在项目根目录自动创建了一个文件。
配置 Phinx 打开上一步得到的 phinx.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?php return [ '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' ];
这个就是数据库的配置表,在这里填上自己的数据库账户和密码。
这里有不同的开发环境配置:production(线上环境)、development(开发环境)、testing(测试环境)。
我们暂且只要配置:development 即可。
paths 字段是数据库迁移文件的存放位置,默认是在项目根目录下的 db 文件夹:
1 2 3 4 'paths' => [ 'migrations' => '%%PHINX_CONFIG_DIR%%/db/migrations', 'seeds' => '%%PHINX_CONFIG_DIR%%/db/seeds' ],
数据库迁移文件属于项目的一部分,因此我把它修改成了在 app 目录下:
1 2 3 4 'paths' => [ 'migrations' => '%%PHINX_CONFIG_DIR%%/app/database/migrations', 'seeds' => '%%PHINX_CONFIG_DIR%%/app/database/seeds' ],
然后创建对应的文件夹即可。
创建表 配置好之后就可以使用命令来创建表了:
1 vendor/bin/phinx create User
上述命令生成了 User 表的数据库迁移文件,
可以发现在 app/database/migrations 目录下多出了一个文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?php declare(strict_types=1); use Phinx\Migration\AbstractMigration; final class User extends AbstractMigration { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method * * Remember to call "create()" or "update()" and NOT "save()" when working * with the Table class. */ public function change(): void { } }
在 change 方法里添加代码:
1 2 3 4 5 6 7 8 9 public function change() { // create the table $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 32]) ->addColumn('password', 'string', ['limit' => 64]) ->addColumn('created', 'timestamp', ['default' => 'CURRENT_TIMESTAMP']) ->create(); }
上述代码创建了一张 users 表,包括名称、密码和注册日期。
然后打开 MySQL 数据库,创建一个名字叫做 blog 的数据库。
注意!这里的数据库名字要与 phinx.php 配置文件对应
创建表 数据库迁移文件写好之后,就可以用命令执行数据库迁移了。
1 vendor/bin/phinx migrate
执行完成之后再返回查看 blog 数据库,可以发现 users 表已经创建好了。
除了 users 表之外,还有一张 phinxlog 表,这是用来保存迁移记录的。
后言 数据库迁移属于项目单独引用的,以后再考虑封装到框架里面。