migrations 数据库迁移

最后更新于:2022-04-02 02:22:27

[TOC] > [官方手册](http://docs.phinx.org/en/latest/migrations.html#executing-queries) > [参考网址](https://www.jianshu.com/p/a01c5b6ea7f6) > [参考网址](http://www.bijishequ.com/detail/525120?p=) > migrations 就是通过php 的命令去生成和修改数据库,甚至可以回退 ## 安装 `composer require topthink/think-migration` ## 查看命令 ``` php thinkphp migrate //用于数据库迁移相关操作 migrate:breakpoint Manage breakpoints migrate:create Create a new migration migrate:rollback Rollback the last or to a specific migration migrate:run Migrate the database migrate:status Show migration status seed //用于数据库填充相关操作 seed:create Create a new database seeder seed:run Run database seeders ``` ## 使用`change`方法 迁移(生成数据表) ### 生成 1. 生成迁移类,类名必须使用 驼峰式 命名法, `$ php think migrate:create CreateUserTable` 2. 添加数据库信息 ```php public function change() { $table = $this->table('users',array('engine'=>'MyISAM')); $table ->addColumn('username', 'string',array('limit' => 26,'default'=>'','comment'=>'用户名,登陆使用')) ->addColumn('password', 'string',array('limit' => 32,'default'=>md5('123456'),'comment'=>'用户密码')) ->addColumn('login_status', 'boolean',array('limit' => 1,'default'=>0,'comment'=>'登陆状态')) ->addColumn('login_code', 'string',array('limit' => 32,'default'=>0,'comment'=>'排他性登陆标识')) ->addColumn('last_login_ip', 'integer',array('limit' => 11,'default'=>0,'comment'=>'最后登录IP')) ->addColumn('last_login_time', 'datetime',array('default'=>0,'comment'=>'最后登录时间')) ->addColumn('is_delete', 'boolean',array('limit' => 1,'default'=>0,'comment'=>'删除状态,1已删除')) ->addIndex(array('username'), array('unique' => true)) ->create(); } ``` 3. 执行所有未执行的迁移类 `$ php think migrate:run` 执行某个迁移类 加 `-t`操作 `php think migrate:run -t YYYYMMDDHHMMSS //后面跟上迁移文件文件名的 时间戳部` ### 回滚 回滚迁移,默认只会回滚 最近一次 执行的迁移: `php think migrate:rollback` ` -t` 选项来指定需要回滚的迁移: `$ php think migrate:rollback -t YYYYMMDDHHMMSS` ## 删除`change` 用而使用 `up`和`down`方法 删除默认自带的 change 方法,创建 up() 方法和 down() 方法。 up() 方法是在执行 run 命令执行的, down() 是在执行 rollback 命令执行的。 ``` public function up() { $table = $this->table('users'); $table->addColumn('nickname', 'string', ['limit' => 16, 'null' => false]) ->addColumn('email', 'string', ['limit' => 32, 'null' => false]) ->addColumn('password', 'string', ['limit' => 64, 'null' => false]) ->create(); } public function down() { $this->dropTable('users'); } ``` ## seed 方法生成数据 也可以用来生成非migrations生成的数据库 生成 seen类 `php think seed:create User` 在类中创建数据 ``` public function run(){ public function run(){ $data = [ [ 'password' => $this->_pwd(), 'username' => date('Ymd H:i:s'), ], [ 'password' => $this->_pwd(), 'username' => date('Ymd H:i:s').'_1', ], ]; $posts = $this->table('users'); $posts->insert($data)->save(); } private function _pwd(){ return md5(rand(1111,9999)); } ``` 执行生成命令 `php think seed:run` 如果需要数据伪装更好 可以用安装第三方库 `composer require fzaninotto/faker` ``` public function run() { $faker = Faker\Factory::create(); $data = []; for ($i = 0; $i < 100; $i++) { $data[] = [ 'username' => $faker->userName, 'password' => sha1($faker->password), 'password_salt' => sha1('foo'), 'email' => $faker->email, 'first_name' => $faker->firstName, 'last_name' => $faker->lastName, 'created' => date('Y-m-d H:i:s'), ]; } $this->insert('users', $data); } ```
';