PHPシリーズ| ThinkPHP5の移行データベース移行ツール

詳細は、マイクロチャネル公衆番号に注意してください。

ThinkPHP5移行データベース移行ツール

マイグレーションとは何ですか?

Googleと移行移民を意味する翻訳は、我々が移行として、それを理解するPHPで、データベースで使用される移行は、データベースの移行戦略として理解することができます。前と後の移行と開発、我々はテーブルを作成するために、すべて手書きのSQL文は、手動でデータベースの実装に成功を作成する必要があり、多くの時間を過ごすために、プロジェクトデータベースの初期化光を作成します。

ローカルデータベースで使用されるすべての開発者が必要な場合も多人数チーム開発では、私たちは通常、それは、退屈な非常に複雑ではありません、すれ違うSQLにデータベースファイルをバックアップしているものであれば、テーブルへのデータベース・フィールド変更は、その後、我々は、彼らが地元の手動更新になるように、小さな開発する各パートナーに渡されたSQLステートメントを変更する必要があるので、あなたはそれ一度ことができますが、何回も起こりますか?私は、マイグレーションが少し生まれたように、この種のもので、開発チームは、わずか確かに頭痛だと思います。

移行は、いくつかのファイル管理データベース構造という、これらのファイルは、データベースのコマンドライン構造により変更することができ、実際にSQLを抜粋したものですで、これらのファイルは、反復と反復のプロジェクトバージョンとして、プロジェクトに格納されています。

開発中の小さなパートナーは、データベーステーブルの構造を変更した場合、彼女は唯一の移行ファイルを生成する必要があるとバージョン管理システムにプッシュ、といった:Gitの、および他の小さなパートナーに通知し、他の小さなパートナーは唯一のプルする必要があり、その後、その上に移行コマンドの下のコマンドラインは、プロジェクトの開発をスピードアップするために、データベースの変更の伝統的なプロセスを簡素化します。

移行ファイルアクション

移行ファイルの主な役割は、データベースの構造を管理するために使用され、実際には、それは、とても基本的に、すべてのデータベース操作SQL文の抽象化のセットは、ファイルの移行は、フィールドを追加し、テーブルをドロップし、テーブルを作成し、フィールドを削除することができているとされ、実際には手動でSQL文を記述していますが、すべての権利であることを、それを呼び出すためにのみ、構文のその規則に従って、SQL文を記述手動で移行を必要としませんように。

コマンドを移行

  • migrate:breakpoint ブレークポイントを管理します

  • migrate:create 移行ファイルを作成します。

  • migrate:rollback 最後に、ロールバック、または特定の移行
  • migrate:run データベースの移行
  • migrate:status 移行ステータス

Thinkphp5.1使用の移行

thinkphp5は、開発者のための移行ソリューションのセットを提供していますが、デフォルトの移行ではインストールされていない、我々は手動でインストールする必要があります。実行中のTP5のプロジェクトに作業ディレクトリを変更します。

composer require topthink/think-migration v2.0.3

TP6のデフォルトのバージョンがインストールされ、ここで指定されたインストールtp5.1バージョンV2.0.3で、複数のバージョンが対処:https://packagist.org/packages/topthink/think-migration

実行しphp think、インストールが成功したかどうかを確認するためにコマンドを

画像

私たちは、インストールが成功した、図から移行して子孫を見ることができます

コマンドを作成します

構文:php think migrate:create TableName

TableNameフォーマット:大文字の最初の文字こぶの法則。このコマンドは、そのような私たちが作成する場所として、移行ファイルを作成するために使用されるVideo移行ファイルを:

php think migrate:create Video

まず、パフォーマンスMigratonそれはここに友達になることができ、すべての統一はいを情報の一部を促すメッセージが表示されます。次のように正常に作成:

# php think migrate:create Video
PHP Warning:  Module 'redis' already loaded in Unknown on line 0
 Create migrations directory? [y]/n (yes/no) [yes]:
 > yes

created ./database/migrations/20190804032741_video.php

プロジェクトデータベースディレクトリのルートディレクトリにあるよりも、移行フォルダはフォルダは、先ほど作成した移行ファイルのビデオを見ることができます開いて、移行ファイルを格納するために使用され、そこにあります:

画像

ファイル形式の命名規則:时间 + 随机数 + _ + 文件名

ファイルが作成された後、その内容を見て:

<?php

use think\migration\Migrator;
use think\migration\db\Column;

class Video extends Migrator
{
    /**
     * Change Method.
     *
     * Write your reversible migrations using this method.
     *
     * More information on writing migrations is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-abstractmigration-class
     *
     * The following commands can be used in this method and Phinx will
     * automatically reverse them when rolling back:
     *
     *    createTable
     *    renameTable
     *    addColumn
     *    renameColumn
     *    addIndex
     *    addForeignKey
     *
     * Remember to call "create()" or "update()" and NOT "save()" when working
     * with the Table class.
     */
    public function change()
    {

    }
}

ここで私は、フィールドを高めるために上記で作成した私のビデオファイルを提供する必要があります

Video 以下のテーブル構造

フィールド タイプ 説明
ID int型 主キー
ニックネーム VARCHAR(16) 動画の名前
Eメール VARCHAR(32) ポスト
パスワード varchar64) パスワード

組み込みのデフォルトの削除  change 方法を作成する  up() 方法や  down() 方法を。up() 実行方法は  run 、実行するコマンドdown() 実行中  rollback のコマンドの実行を。

up() ここに方法は次のとおりです。

public function up()
{
    $table = $this->table('video');
    $table->addColumn('name', 'string', ['limit' => 16, 'null' => false,'comment'=>'视频名称'])
    ->addColumn('email', 'string', ['limit' => 32, 'null' => false,'comment'=>'邮箱'])
    ->addColumn('password', 'string', ['limit' => 64, 'null' => false,'comment'=>'密码'])
    ->create();
}

down() ここに方法は次のとおりです。

public function down()
{
    $this->dropTable('video');
}

ファイルの内容全体

<?php

use think\migration\Migrator;
use think\migration\db\Column;

class Video extends Migrator
{
    // migrate:run 时执行
    public function up()
    {
        $table = $this->table('video');
        $table->addColumn('name', 'string', ['limit' => 16, 'null' => false,'comment'=>'名称'])
          ->addColumn('email', 'string', ['limit' => 32, 'null' => false,'comment'=>'邮箱'])
          ->addColumn('password', 'string', ['limit' => 64, 'null' => false,'comment'=>'密码'])
          ->create();
    }

    // migrate:rollback 时执行
    public function down()
    {
        $this->dropTable('video');
    }
}

このように、あなたは、テーブルの上のビデオファイルの移行が作成され、次のコマンドを学ぶための次のステップを作成することができます。

移行:コマンドを実行します。

移行ファイルが作成され、あなたが実行する必要がある  run コマンドは、データベースを変更することができます。

正しく設定この手順を実行する前に注意してください  config/database.php 。ここでは、データベースの接頭辞がありますiot_

php think migrate:run

正常に実行された後、以上の2つのテーブルをデータベースを表示iot_migrationsし、iot_video

iot_video以下のテーブル構造

mysql> desc iot_video;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(16) | NO   |     | NULL    |                |
| email    | varchar(32) | NO   |     | NULL    |                |
| password | varchar(64) | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.07 sec)

私は唯一の指定された移行を定義する前にnicknameemailpassword三つのフィールドが、実行runtableコマンドがより多くの4つの分野、作成するために、id主キーを?これがされてthinkphp5私たちのデフォルトに追加します!それにジュニアパートナー注目!あなたの主キーフィールドが呼び出された場合は、id手動で指定する必要はありません。

iot_videoデザインテーブル構造ビューのコメント

画像

iot_migrations目次は何ですか?

mysql> select * from iot_migrations G;
+----------------+----------------+---------------------+---------------------+------------+
| version        | migration_name | start_time          | end_time            | breakpoint |
+----------------+----------------+---------------------+---------------------+------------+
| 20190804032741 | Video          | 2019-08-04 11:49:49 | 2019-08-04 11:49:50 |          0 |
+----------------+----------------+---------------------+---------------------+------------+
1 row in set (0.08 sec)

ちょうど、実行が成功した後に名付けられたレコードを実行し、ファイル名とバージョン20,190,804,032,741が一から一であることがわかります

移行:statusコマンド

説明:移行ステータスを表示します

# php think migrate:status
 Status  Migration ID    Started              Finished             Migration Name 
----------------------------------------------------------------------------------
     up  20190804032741  2019-08-04 11:49:49  2019-08-04 11:49:50  Video

の移行の実装を示すリストの形式

移行:roolbackコマンド

説明:ロールバックの最後または特定の移行

構文:php think migrate:rollback

# php think migrate:rollback --help
Help:
 The migrate:rollback command reverts the last migration, or optionally up to a specific version

 php console migrate:rollback
 php console migrate:rollback -t 20111018185412 //指定版本
 php console migrate:rollback -d 20111018
 php console migrate:rollback -v

ロールバック操作

# php think migrate:rollback
PHP Warning:  Module 'redis' already loaded in Unknown on line 0

 == 20190804032741 Video: reverting
 == 20190804032741 Video: reverted 0.1992s

All Done. Took 0.6151s

この時間は、削除されたデータベーステーブルの構造とデータベーステーブルを表示、それは存在しません。

mysql> desc iot_video;
1146 - Table 'iot.tinywan.com.iot_video' doesn't exist
mysql> select * from iot_migrations;
Empty set

表中のIot_migrationsのデータが削除さと一緒に、存在しません。

新規フィールド

テーブルの上に二次的操作は二度同じスクリプトで、あなただけの新しいスクリプトを作成することができ、編集することはできません。

次の表をiot_videoテーブル構造を再生成するために、新しいフィールドを追加

Video 以下の表は、フィールドを増やします

フィールド タイプ 説明
upload_time int型(11) 更新
ユーザーID int型(11) ユーザIDをアップロード

新しいスクリプトを作成します。

# php think migrate:create Video2
created ./database/migrations/20190804082737_video2.php

ビデオ2ファイルの内容

<?php

use think\migration\Migrator;

class Video2 extends Migrator
{
    public function up()
    {
        $table = $this->table('video');
        $table->addColumn('upload_time', 'string', ['limit' => 11, 'null' => false,'comment'=>'上传时间'])
            ->addColumn('user_id', 'string', ['limit' => 11, 'null' => false,'comment'=>'上传用户ID'])
            ->save();
    }
}

データ移行

# php think migrate:run

 == 20190804082737 Video2: migrating
 == 20190804082737 Video2: migrated 0.3345s

All Done. Took 0.7070s

ビューのテーブル構造

mysql> desc iot_video;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     | NO   | PRI | NULL    | auto_increment |
| name        | varchar(16) | NO   |     | NULL    |                |
| email       | varchar(32) | NO   |     | NULL    |                |
| password    | varchar(64) | NO   |     | NULL    |                |
| upload_time | varchar(11) | NO   |     | NULL    |                |
| user_id     | varchar(11) | NO   |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
6 rows in set (0.08 sec)

付録

メソッドテーブル

メソッド名 説明
SETID(文字列$ ID) 主キーのフィールド名を設定します。
setPrimaryKey(文字列$キー) 主キーを設定します
setEngine(文字列$エンジン) ストレージエンジンを設定し、そこにある:InnoDBは、MyISAMテーブル
setComment(文字列$コメント) テーブルのメモを設定します
addTimestamps($ createAtName文字列、文字列\(updateAtName)|テーブルプラスを作成するための時間や編集時二つのフィールドは、デフォルトのフィールド名は次のとおりです。CREATE_TIME、UPDATE_TIME | | AddColumn関数(\) COLUMNNAME、タイプの$、\(オプション)|へテーブルのフィールドを追加| | changeColumn(\) COLUMNNAME、$ニュータイプ、\(オプション)|フィールド変更テーブルの属性| |作成する()| |テーブルを保存| |()保存|テーブルを作成|名前変更(\) newTableName) テーブル名の名前を変更します
hasTable($ tableNameの)| ()が存在します テーブルがあるかどうかを確認
setIndexes(配列$ indexs) バッチセットのインデックス
ドロップ() 現在のテーブルを削除します
setForeignKeys(配列\(のForeignKey)|设置外键| | removeColumn(\) COLUMNNAME) フィールドを削除します
renameColumn($ OLDNAME、$ NEWNAME) フィールドの名前を変更します
(配列$データ)を挿入 データの挿入

列タイプ

タイプ
biginteger
binary
boolean
date
datetime
decimal
float
integer
string
text
time
timestamp
uuid

オプションのパラメータ

パラメータ 説明
limit 長さの制限、整数
length limit整数
default 混合既定値、
null 空、ブール値かどうか
after どのフィールドの後
comment 注記

ここでは、decimal型のためです。

パラメータ 説明
precision 長さは、整数
scale 長小数、整数
signed 符号なし、ブール値かどうか

以下は、列挙型とセット型に対して次のとおりです。

パラメータ 説明
values デフォルト値

おすすめ

転載: www.cnblogs.com/tinywan/p/11298997.html