이 글에서는 yii2.0 데이터베이스 마이그레이션 방법을 설명합니다. 다음과 같이 참조용으로 모든 사람과 공유하십시오.
마이그레이션 생성
새 마이그레이션을 생성하려면 다음 명령을 사용하십시오.
yii migrate/create <name>
필수 매개변수 이름은 새 마이그레이션에 대한 간략한 설명을 제공하는 데 사용됩니다. 예를 들어, 이 마이그레이션을 사용하여 여러 데이터베이스의 동일한 테이블에 필드를 추가하는 경우(각 데이터베이스에 뉴스 테이블이 있다고 가정) addColumn_news라는 이름을 사용하고(이름은 사용자 정의됨) 다음 명령을 실행할 수 있습니다.
yii migrate/create addColumn_news
참고: name 매개변수는 마이그레이션된 클래스 이름의 일부를 생성하는 데 사용되므로 이 매개변수에는 문자, 숫자 및 밑줄만 포함해야 합니다.
위 명령은 @app/migrations 디렉터리에 m150101_185401_addColumn_news.php라는 새 PHP 클래스 파일을 생성합니다. 이 파일에는 마이그레이션 클래스 m150101_185401_addColumn_news를 선언하는 데 사용되는 다음 코드가 포함되어 있으며 코드 뼈대와 함께 제공됩니다.
<?php use yii\db\Schema; use yii\db\Migration; class m150101_185401_addColumn_news extends Migration { //createDbs 该方法是获取数据库对象返回 private function createDbs(){ $dbs = []; $dbs_info =\Yii::$app->params['db']; foreach($dbs_info as $k=>$v){ $dbs[$k] = \Yii::createObject($v); } return $dbs; } //up() 该方法是往不同的数据库的news表添加 name,nickname,age,sex,site_id等字段 public function up() { $dbs = $this->createDbs(); foreach($dbs as $v){ //《------遍历讲字段同时添加到不同的数据库中 $this->db=$v; $this->addColumn('{{%news}}','name','varchar(20)'); $this->addColumn('{{%news}}','nickname','varchar(20)'); $this->addColumn('{{%news}}','age','int(3)'); $this->addColumn('{{%news}}','sex','int(1)'); $this->addColumn('{{%news}}','site_id','int(5)'); } } //down() 该方法与up()方法相反,是删除字段的意思 public function down() { $dbs = $this->createDbs(); foreach($dbs as $v){ $this->db=$v; $this->dropColumn('{{%news}}','name','varchar(20)'); $this->dropColumn('{{%news}}','nickname','varchar(20)'); $this->dropColumn('{{%news}}','age','int(3)'); $this->dropColumn('{{%news}}','sex','int(1)'); $this->dropColumn('{{%news}}','site_id','int(5)'); } } }
각 데이터베이스 마이그레이션은 정의되어야 합니다. yiidbMigration에서 상속된 PHP 클래스입니다. 클래스 이름은 m
migration 클래스의 up() 메소드에서 데이터베이스 구조를 변경하는 코드를 작성해야 합니다. up() 메서드에 의해 변경된 내용을 되돌리려면 down() 메서드에 코드를 작성해야 할 수도 있습니다. 마이그레이션을 통해 데이터베이스를 업그레이드하는 경우 up() 메서드가 호출되고, 반대의 경우 down() 메서드가 호출됩니다. 다음 코드는 마이그레이션 클래스를 통해 뉴스 테이블을 생성하는 방법을 보여줍니다.
use yii\db\Schema; use yii\db\Migration; class m150101_185401_create_news_table extends \yii\db\Migration { public function up() { $this->createTable('news', [ 'id' => Schema::TYPE_PK, 'title' => Schema::TYPE_STRING . ' NOT NULL', 'content' => Schema::TYPE_TEXT, ]); } public function down() { $this->dropTable('news'); } }
참고: 모든 마이그레이션을 되돌릴 수 있는 것은 아닙니다. 예를 들어 up() 메서드가 테이블의 데이터 행을 삭제하는 경우 이 데이터는 down() 메서드로 복원할 수 없습니다. 때로는 데이터베이스 마이그레이션을 되돌리는 데 그다지 유용하지 않기 때문에 down() 메서드를 실행하기에는 너무 게으른 경우도 있습니다. 이 경우 down() 메서드에서 false를 반환하여 마이그레이션을 되돌릴 수 없음을 나타내야 합니다.
데이터베이스 액세스 방법
마이그레이션 기본 클래스 yiidbMigration은 데이터베이스 액세스 및 운영을 위한 전체 메서드 세트를 제공합니다. 이러한 메서드의 이름은 yiidbCommand 클래스에서 제공하는 DAO 메서드와 유사하다는 것을 알 수 있습니다. 예를 들어 yiidbMigration::createTable() 메서드는 yiidbCommand::createTable()과 동일한 기능을 갖는 새 테이블을 생성할 수 있습니다.
yiidbMigration에서 제공하는 메소드를 사용하면 더 이상 yiidbCommand 인스턴스를 명시적으로 생성할 필요가 없으며, 각 메소드를 실행할 때 데이터베이스 작업이 완료되었는지 알려주는 몇 가지 유용한 정보가 표시된다는 점입니다. 이러한 작업을 완료하는 데 걸린 시간 등
다음은 이러한 모든 데이터베이스 액세스 방법의 목록입니다.
yiidbMigration::execute(): SQL 문 실행
yiidbMigration::insert(): 단일 행 삽입 data
yiidbMigration ::batchInsert(): 여러 데이터 행 삽입
yiidbMigration::update(): 데이터 업데이트
yiidbMigration::delete(): 데이터 삭제
yiidbMigration::createTable(): 테이블 생성
yiidbMigration ::renameTable(): 테이블 이름 이름 바꾸기
yiidbMigration::dropTable(): 테이블 삭제
yiidbMigration::truncateTable(): 테이블의 모든 데이터 지우기
yiidbMigration: :addColumn(): 필드 추가
yiidbMigration::renameColumn(): 필드 이름 변경
yiidbMigration::dropColumn(): 필드 삭제
yiidbMigration::alterColumn(): 필드 수정
yiidbMigration::addPrimaryKey( ): 기본 키 추가
yiidbMigration::dropPrimaryKey(): 기본 키 삭제
yiidbMigration::addForeignKey(): 외래 키 추가
yiidbMigration::dropForeignKey(): 외래 키 삭제
yiidbMigration ::createIndex(): 인덱스 생성
yiidbMigration::dropIndex(): 인덱스 삭제
마이그레이션 제출
데이터베이스를 업그레이드하려면 최신 구조에 적용하려면 다음 명령을 사용해야 합니다. 모든 새로운 마이그레이션을 커밋하려면:
yii migrate
이 명령은 지금까지 커밋되지 않은 모든 마이그레이션을 나열합니다. 이러한 마이그레이션을 제출해야 한다고 결정하면 클래스 이름의 타임스탬프 순서에 따라 각 새 마이그레이션 클래스에서 up() 또는 safeUp() 메서드가 차례로 실행됩니다. 마이그레이션 중 하나라도 커밋에 실패하면 이 명령은 아직 실행되지 않은 나머지 마이그레이션을 종료하고 중지합니다.
성공적으로 제출된 각 마이그레이션에 대해 이 명령은 마이그레이션이라는 데이터베이스 테이블에 성공적으로 제출된 마이그레이션을 포함하는 기록을 삽입합니다. 이 기록은 마이그레이션 도구가 제출된 마이그레이션과 제출되지 않은 마이그레이션을 확인하는 데 도움이 됩니다. 아직.
팁: 마이그레이션 도구는 이 명령의 yiiconsolecontrollersMigrateController::db 옵션에 지정된 데이터베이스에 마이그레이션 테이블을 자동으로 생성합니다. 기본적으로 이는 db 애플리케이션 구성요소에 의해 지정됩니다.
有时,你可能只需要提交一个或者少数的几个迁移,你可以使用该命令指定需要执行的条数,而不是执行所有的可用迁移。例如,如下命令将会尝试提交前三个可用的迁移:
yii migrate 3
你也可以指定一个特定的迁移,按照如下格式使用 migrate/to 命令来指定数据库应该提交哪一个迁移:
yii migrate/to 150101_185401 # using timestamp to specify the migration 使用时间戳来指定迁移 yii migrate/to "2015-01-01 18:54:01" # using a string that can be parsed by strtotime() 使用一个可以被 strtotime() 解析的字符串 yii migrate/to m150101_185401_create_news_table # using full name 使用全名 yii migrate/to 1392853618 # using UNIX timestamp 使用 UNIX 时间戳
如果在指定要提交的迁移前面还有未提交的迁移,那么在执行这个被指定的迁移之前,这些还未提交的迁移会先被提交。
如果被指定提交的迁移在之前已经被提交过,那么在其之后的那些迁移将会被还原。
还原迁移
你可以使用如下命令来还原其中一个或多个意见被提交过的迁移:
yii migrate/down # revert the most recently applied migration 还原最近一次提交的迁移 yii migrate/down 3 # revert the most 3 recently applied migrations 还原最近三次提交的迁移
注意:并不是所有的迁移都能被还原。尝试还原这类迁移将可能导致报错甚至是终止所有的还原进程。
重做迁移
重做迁移的意思是先还原指定的迁移,然后再次提交。如下所示:
yii migrate/redo # redo the last applied migration 重做最近一次提交的迁移 yii migrate/redo 3 # redo the last 3 applied migrations 重做最近三次提交的迁移
注意:如果一个迁移是不能被还原的,那么你将无法对它进行重做。
列出迁移
你可以使用如下命令列出那些提交了的或者是还未提交的迁移:
yii migrate/history # 显示最近10次提交的迁移 yii migrate/history 5 # 显示最近5次提交的迁移 yii migrate/history all # 显示所有已经提交过的迁移 yii migrate/new # 显示前10个还未提交的迁移 yii migrate/new 5 # 显示前5个还未提交的迁移 yii migrate/new all # 显示所有还未提交的迁移
修改迁移历史
有时候你也许需要简单的标记一下你的数据库已经升级到一个特定的迁移,而不是实际提交或者是还原迁移。这个经常会发生在你手动的改变数据库的一个特定状态,而又不想相应的迁移被重复提交。那么你可以使用如下命令来达到目的:
yii migrate/mark 150101_185401 # 使用时间戳来指定迁移 yii migrate/mark "2015-01-01 18:54:01" # 使用一个可以被 strtotime() 解析的字符串 yii migrate/mark m150101_185401_create_news_table # 使用全名 yii migrate/mark 1392853618 # 使用 UNIX 时间戳
该命令将会添加或者删除 migration 表当中的某几行数据来表明数据库已经提交到了指定的某个迁移上。执行这条命令期间不会有任何的迁移会被提交或还原。
自定义迁移
有很多方法可以自定义迁移命令。
使用命令行选项
迁移命令附带了几个命令行选项,可以用来自定义它的行为:
interactive: boolean (默认值为 true),指定是否以交互模式来运行迁移。当被设置为 true 时,在命令执行某些操作前,会提示用户。如果你希望在后台执行该命令,那么你应该把它设置成 false。
migrationPath: string (默认值为 @app/migrations),指定存放所有迁移类文件的目录。该选项可以是一个目录的路径,也可以是 路径别名。需要注意的是指定的目录必选存在,否则将会触发一个错误。
migrationTable: string (默认值为 migration),指定用于存储迁移历史信息的数据库表名称。如果这张表不存在,那么迁移命令将自动创建这张表。当然你也可以使用这样的字段结构: version
varchar(255) primary key, apply_time integer 来手动创建这张表。
db: string (默认值为 db),指定数据库 application component 的 ID。它指的是将会被该命令迁移的数据库。
templateFile: string (defaults to @yii/views/migration.php),指定生产迁移框架代码类文件的模版文件路径。该选项即可以使用文件路径来指定,也可以使用路径 别名 来指定。该模版文件是一个可以使用预定义变量 $className 来获取迁移类名称的 PHP 脚本。
如下例子向我们展示了如何使用这些选项:
例如,如果我们需要迁移一个 forum 模块,而该迁移文件放在该模块下的 migrations 目录当中,那么我们可以使用如下命令:
# 在 forum 模块中以非交互模式进行迁移 yii migrate --migrationPath=@app/modules/forum/migrations --interactive=0
全局配置命令
在运行迁移命令的时候每次都要重复的输入一些同样的参数会很烦人,这时候,你可以选择在应用程序配置当中进行全局配置,一劳永逸:
return [ 'controllerMap' => [ 'migrate' => [ 'class' => 'yii\console\controllers\MigrateController', 'migrationTable' => 'backend_migration', ], ], ];
如上所示配置,在每次运行迁移命令的时候,backend_migration 表将会被用来记录迁移历史。你再也不需要通过 migrationTable 命令行参数来指定这张历史纪录表了。
迁移多个数据库
默认情况下,迁移将会提交到由 db application component 所定义的同一个数据库当中。如果你需要提交到不同的数据库,你可以像下面那样指定 db 命令行选项,
yii migrate --db=db2
上面的命令将会把迁移提交到 db2 数据库当中。
偶尔有限时候你需要提交 一些 迁移到一个数据库,而另外一些则提交到另一个数据库。为了达到这个目的,你应该在实现一个迁移类的时候指定需要用到的数据库组件的 ID , 如下所示:
use yii\db\Schema; use yii\db\Migration; class m150101_185401_create_news_table extends Migration { public function init() { $this->db = 'db2'; parent::init(); } }
即使你使用 db 命令行选项指定了另外一个不同的数据库,上面的迁移还是会被提交到 db2 当中。需要注意的是这个时候迁移的历史信息依然会被记录到 db 命令行选项所指定的数据库当中。
如果有多个迁移都使用到了同一个数据库,那么建议你创建一个迁移的基类,里面包含上述的 init() 代码。然后每个迁移类都继承这个基类就可以了。
提示:除了在 yii\db\Migration::db 参数当中进行设置以外,你还可以通过在迁移类中创建新的数据库连接来操作不同的数据库。然后通过这些连接再使用 DAO 方法 来操作不同的数据库。
另外一个可以让你迁移多个数据库的策略是把迁移存放到不同的目录下,然后你可以通过如下命令分别对不同的数据库进行迁移:
yii migrate --migrationPath=@app/migrations/db1 --db=db1 yii migrate --migrationPath=@app/migrations/db2 --db=db2 ...
第一条命令将会把 @app/migrations/db1 目录下的迁移提交到 db1 数据库当中,第二条命令则会把 @app/migrations/db2 下的迁移提交到 db2 数据库当中,以此类推。
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。
更多yii2.0数据库迁移教程相关文章请关注PHP中文网!