마이그레이션 Migrations Class

마이그레이션을 통해서 쉽고 안정적으로 데이터베이스를 변경(alter) 할 수 있습니다. 수작업으로 sql을 만들 수도 있지만, 그럴 경우 어떤 것이 변경되었는지, 다음 배포때는 어떤것이 수행되어야하는지, 기억하고 있어야 합니다.

데이터베이스 테이블 마이그레이션 (migration) 은 어떤 마이그레이션이 수행되었는지 지속적으로 추적해 주기 때문에, 개발자는 단지 프로그램 파일을 업데이트 하고 $this->migration->current() 만 호출하면,배포에 필요한 마이그레이션이 수행됩니다.현재 버전은 application/config/migration.php 에 있습니다.

마이그레이션 파일명 Migration file names

각 마이그레이션은 숫자 순서대로 앞으로 또는 뒤로 실행합니다. 두 가지 번호 스타일을 사용할 수 있습니다:

  • 순차적 Sequential: 각 마이그레이션을 할 때 001 부터 순차적으로 번호가 생성됩니다. 각 번호는 3자리이며, 숫자 중간에 어떤 틈도 없습니다.
  • 타임스탬프 Timestamp: 각 마이그레이션 할 때 마이그레이션 타임 스탬프를 사용하여 YYYYMMDDHHIISS와 같은 형식으로 번호가 생성됩니다. format (e.g. 20121031100537). 이것은 팀 환경에서 작업 번호 충돌을 방지하는 데 도움이 됩니다.

application/config/migration.php 파일 안에서 $config['migration_type'] 를 사용해 원하는 스타일을 고를 수 있습니다.

어떤 넘버링 스타일을 사용하기로 결정하였던지, 넘버링되는 마이그레이션 파일 접두사는 언더스코어로 연결됩니다. 예제:

  • 001_add_blog.php (순차적 넘버링)
  • 20121031100537_add_blog.php (타임스탬프 넘버링)

마이그레이션 생성 Create a Migration

블로그를 포함하고 있는 새 사이트의 첫 번째 마이그레이션 일 경우입니다. 모든 마이그레이션은 application/migrations/ 으로 들어가며, 이름은 20121031100537_add_blog.php 와 같은 형태가 됩니다.

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Migration_Add_blog extends CI_Migration {

        public function up()
        {
                $this->dbforge->add_field(array(
                        'blog_id' => array(
                                'type' => 'INT',
                                'constraint' => 5,
                                'unsigned' => TRUE,
                                'auto_increment' => TRUE
                        ),
                        'blog_title' => array(
                                'type' => 'VARCHAR',
                                'constraint' => '100',
                        ),
                        'blog_description' => array(
                                'type' => 'TEXT',
                                'null' => TRUE,
                        ),
                ));
                $this->dbforge->add_key('blog_id', TRUE);
                $this->dbforge->create_table('blog');
        }

        public function down()
        {
                $this->dbforge->drop_table('blog');
        }
}

그리고 application/config/migration.php 에서 $config['migration_version'] = 1; 으로 설정합니다.

사용 예제 Usage Example

예제에서 사용되는 코드는 application/controllers/Migrate.php 에 있으며 스키마를 업데이트 합니다:

<?php

class Migrate extends CI_Controller
{

        public function index()
        {
                $this->load->library('migration');

                if ($this->migration->current() === FALSE)
                {
                        show_error($this->migration->error_string());
                }
        }

}

마이그레이션 설정 Migration Preferences

다음은 마이그레이션에 대한 모든 구성 옵션의 테이블.

설정 기본값 옵션 설명
migration_enabled FALSE TRUE / FALSE 마이그레이션 사용/비사용 설정
migration_path APPPATH.’migrations/’ None 마이그레이션 폴더 경로.
migration_version 0 None 데이터베이스가 사용하고 있는 현재버전.
migration_table migrations None 스키마를 저장하기위한 테이블명, 버전 번호.
migration_auto_latest FALSE TRUE / FALSE 마이그레이션 자동실행 활성화/비활성화
migration_type ‘timestamp’ ‘timestamp’ / ‘sequential’ 마이그레이션 파일 이름에 사용되는 숫자 식별자의 유형.

클래스 레퍼런스 Class Reference

class CI_Migration
current()
반환값:TRUE if no migrations are found, current version string on success, FALSE on failure
반환형:mixed

application/config/migration.php 에 있는 $config['migration_version'] 에 설정된 현재버전.

error_string()
반환값:Error messages
반환형:string

이 마이그레이션을 수행하는 동안 발견 된 오류 문자열을 반환.

find_migrations()
반환값:An array of migration files
반환형:배열(array)

마이그레이션 파일 이름의 배열 migration_path에서 발견되면 반환됩니다.

latest()
반환값:TRUE if no migrations are found, current version string on success, FALSE on failure
반환형:mixed

current() 와 매우 비슷하게 작동합니다. 그러나 $config['migration_version'] 를 찾는 대신 마이그레이션 클래스는 파일 시스템에서 발견된 가장 최근의 마이그레이션 파일을 사용할 것입니다.

version($target_version)
인수:
  • $target_version (mixed) – Migration version to process
반환값:

TRUE if no migrations are found, current version string on success, FALSE on failure

반환형:

mixed

버전은 롤백을 위해 사용될 수 있습니다. 또는 특정 버전으로 프로그래밍적으로 이동할 수 있게 합니다. 이것은 current() 처럼 작동하나, $config['migration_version']는 무시합니다.

$this->migration->version(5);