데이터베이스 마이그레이션

마이그레이션은 체계적인 방식으로 데이터베이스를 변경할 수 있는 편리한 방법입니다. SQL을 직접 편집할 수 있지만 다른 개발자에게 실행해야 한다고 알려 주어야 하고, 배포할 때마다 프로덕션 시스템에 대해 어떤 변경 사항을 실행해야 하는지 추적해야 합니다.

데이터베이스 테이블 migrations은 이미 실행된 마이그레이션을 추적합니다. 마이그레이션이 제대로 수행되었는지 확인하고 $migration->latest()를 호출하면 데이터베이스를 최근 상태로 전환합니다. $migration->setNamespace(null)->latest()를 사용하면 모든 네임스페이스에서 마이그레이션을 적용합니다.

마이그레이션 파일 이름

각 마이그레이션은 수행된 방법에 따라 앞뒤로 숫자 순서에 따라 실행됩니다. 각 마이그레이션은 마이그레이션이 생성될 때 타임스탬프를 사용하여 YYYY-MM-DD-HHIISS 형식 (예 : 2012-10-31-100537)으로 번호가 매겨집니다. 이렇게 하면 팀 환경에서 작업할 때 번호 충돌을 방지할 수 있습니다.

마이그레이션 파일의 접두사 뒤에 밑줄과 마이그레이션을 설명하는 이름이 붙습니다. 연도, 월 및 날짜는 대시, 밑줄로 구분하거나 전혀 구분하지 않을 수 있습니다.

  • 2012-10-31-100538_AlterBlogTrackViews.php

  • 2012_10_31_100539_AlterBlogAddTranslations.php

  • 20121031100537_AddBlog.php

마이그레이션 만들기

아래는 블로그가 있는 새 사이트의 첫 번째 마이그레이션입니다. 모든 마이그레이션은 app/Database/Migrations/ 디렉토리에 있으며 이름은 2022-01-31-013057_AddBlog.php와 같습니다.

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddBlog extends Migration
{
    public function up()
    {
        $this->forge->addField([
            'blog_id' => [
                'type'           => 'INT',
                'constraint'     => 5,
                'unsigned'       => true,
                'auto_increment' => true,
            ],
            'blog_title' => [
                'type'       => 'VARCHAR',
                'constraint' => '100',
            ],
            'blog_description' => [
                'type' => 'TEXT',
                'null' => true,
            ],
        ]);
        $this->forge->addKey('blog_id', true);
        $this->forge->createTable('blog');
    }

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

데이터베이스 연결 및 데이터베이스 Forge 클래스는 각각 $this->db$this->forge를 통해 사용할 수 있습니다.

커맨드 라인 호출을 사용하여 스켈레톤 마이그레이션 파일을 생성할 수 있으며, 이에 대한 자세한 내용은 아래를 참조하십시오. 자세한 내용은 Command-Line 툴make:migration을 참조하세요.

Note

마이그레이션 클래스는 PHP 클래스이므로 클래스 이름은 모든 마이그레이션 파일에서 유일(unique)해야 합니다.

외래 키(Foreign Key)

테이블에 외래 키가 포함되어 있으면 테이블과 컬럼을 삭제하려고 할 때 마이그레이션으로 인해 문제가 발생할 수 있습니다. 마이그레이션을 실행하는 동안 외래 키 검사를 일시적으로 무시하려면 데이터베이스 연결에서 disableForeignKeyChecks()enableForeignKeyChecks () 메소드를 사용하십시오.

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddBlog extends Migration
{
    public function up()
    {
        $this->db->disableForeignKeyChecks();

        // Migration rules would go here..

        $this->db->enableForeignKeyChecks();
    }
}

데이터베이스 그룹

마이그레이션은 단일 데이터베이스 그룹에 대해서만 실행됩니다. app/Config/Database.php에 여러 그룹이 정의되어 있으면 $defaultGroup에 지정된 그룹에 대해 마이그레이션이 실행됩니다. 데이터베이스 그룹마다 다른 스키마가 필요할 수 있습니다. 모든 일반 사이트 정보에 사용되는 하나의 데이터베이스와 미션 크리티컬 데이터에 사용되는 다른 데이터베이스가 있을 수 있습니다. 마이그레이션에서 $DBGroup 속성을 설정하여 적절한 그룹에 대해서만 마이그레이션을 실행할 수 있습니다. 이 이름은 데이터베이스 그룹의 이름과 정확히 일치해야합니다.

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddBlog extends Migration
{
    protected $DBGroup = 'alternate_db_group';

    public function up()
    {
        // ...
    }

    public function down()
    {
        // ...
    }
}

네임스페이스

마이그레이션 라이브러리는 디렉토리 이름과 일치하는 $psr4 속성을 사용하여 app/Config/Autoload.php 내에 정의하거나 Composer와 같은 외부 소스에서 로드한 모든 네임스페이스를 자동으로 스캔할 수 있습니다. Database/Migrations에서 찾은 모든 마이그레이션이 포함됩니다.

각 네임스페이스에는 고유한 버전 순서가 있으므로 다른 네임스페이스에 영향을 주지 않고 각 모듈(네임스페이스)을 업그레이드하고 다운그레이드할 수 있습니다.

예를 들어, Autoload 구성 파일에 다음 네임스페이스가 정의되어 있다고 가정합니다.

<?php

$psr4 = [
    'App'       => APPPATH,
    'MyCompany' => ROOTPATH . 'MyCompany',
];

APPPATH/Database/MigrationsROOTPATH/MyCompany/Database/Migrations에 있는 모든 마이그레이션을 찾습니다. 따라서 재사용 가능한 모듈식 코드 스위트에 마이그레이션을 간편하게 포함할 수 있습니다.

사용 예제

아래 예제에는 app/Controllers/Migrate.php에 스키마를 업데이트하는 간단한 코드가 있습니다.

<?php

namespace App\Controllers;

use CodeIgniter\Controller;
use Throwable;

class Migrate extends Controller
{
    public function index()
    {
        $migrate = \Config\Services::migrations();

        try {
            $migrate->latest();
        } catch (Throwable $e) {
            // Do something with the error here...
        }
    }
}

Command-Line 툴

CodeIgniter는 마이그레이션 작업에 도움이되는 커맨드 라인에서 사용할 수있는 몇 가지 명령과 함께 제공됩니다. 이러한 도구는 마이그레이션을 사용할 필요는 없지만 사용하려는 사람들이 쉽게 사용할 수 있습니다. 이 도구는 주로 MigrationRunner 클래스에서 사용할 수 있는 동일한 메소드에 대한 액세스를 제공합니다.

migrate

사용 가능한 모든 마이그레이션으로 데이터베이스 그룹을 마이그레이션

> php spark migrate

다음 옵션과 함께 (migrate)를 사용할 수 있습니다:

  • -g - 데이터베이스 그룹을 선택, 그렇지 않으면 기본 데이터베이스 그룹이 사용됩니다.

  • -n - 네임스페이스 선택, 그렇지 않으면 App 네임스페이스가 사용됩니다.

  • --all - 모든 네임스페이스를 최신 마이그레이션으로 마이그레이션합니다.

다음 예제는 test 데이터베이스 그룹을 Acme\Blog 네임스페이스를 가진 데이터베이스 그룹으로 마이그레이션합니다.

> php spark migrate -g test -n 'Acme\Blog'

--all 옵션을 사용하면 실행되지 않은 마이그레이션을 찾기 위해 모든 네임스페이스를 검색합니다. 이들은 모두 수집된 다음 생성된 날짜별로 그룹으로 정렬되며, 기본 어플리케이션과 모듈의 잠재적 충돌을 최소화합니다.

rollback

모든 마이그레이션을 롤백하여 데이터베이스 그룹을 빈 슬레이트(blan slate)로 전환하고 마이그레이션 효과를 0으로 합니다.

> php spark migrate:rollback

다음 옵션과 함께 (rollback)을 사용할 수 있습니다:

  • -g - 데이터베이스 그룹 선택, 선택하지 않은 경우 기본(default) 데이터베이스 그룹을 사용합니다.

  • -b - 배치(batch) 버전 선택: 버전이 음수면 현재 버전을 기준으로 이전 버전 배치를 선택합니다.

  • -f - 바이패스 확인 질문을 강요, 프로덕션 환경에서만 질문합니다.

refresh

먼저 모든 마이그레이션을 롤백한 후 모두 마이그레이션하여 데이터베이스 상태를 새로 고칩니다.

> php spark migrate:refresh

다음 옵션으로 (refresh)을 사용할 수 있습니다:

  • -g - 데이터베이스 그룹 선택, 선택하지 않은 경우 기본(default) 데이터베이스 그룹을 사용합니다.

  • -n - 네임스페이스 선택, 선택하지 않은 경우 App 네임스페이스가 사용됩니다.

  • --all - 모든 네임스페이스 새로 고침

  • -f - 바이패스 확인 질문을 강요, 프로덕션 환경에서만 질문합니다.

status

모든 마이그레이션 및 실행한 날짜와 시간의 목록 또는 실행되지 않은 경우 ‘–‘를 표시합니다.

> php spark migrate:status
+----------------------+-------------------+-----------------------+---------+---------------------+-------+
| Namespace            | Version           | Filename              | Group   | Migrated On         | Batch |
+----------------------+-------------------+-----------------------+---------+---------------------+-------+
| App                  | 2022-04-06-234508 | CreateCiSessionsTable | default | 2022-04-06 18:45:14 | 2     |
| CodeIgniter\Settings | 2021-07-04-041948 | CreateSettingsTable   | default | 2022-04-06 01:23:08 | 1     |
| CodeIgniter\Settings | 2021-11-14-143905 | AddContextColumn      | default | 2022-04-06 01:23:08 | 1     |
+----------------------+-------------------+-----------------------+---------+---------------------+-------+

다음 옵션과 함께 (status)를 사용할 수 있습니다:

  • -g - 데이터베이스 그룹을 선택, 그렇지 않으면 기본 데이터베이스 그룹 사용

make:migration

app/Database/Migrations에 스켈레톤 마이그레이션 파일을 생성합니다. 현재 타임 스탬프를 자동으로 추가합니다. 클래스 이름은 파스칼 케이스 버전의 파일 이름입니다.

> php spark make:migration <class> [options]

다음 옵션으로 (make:migration) 사용할 수 있습니다:

  • --session - 데이터베이스 세션에 대한 마이그레이션 파일을 생성합니다.

  • --table - 데이터베이스 세션에 사용할 테이블 이름입니다. 기본 값: ci_sessions.

  • --dbgroup - 데이터베이스 세션에 사용할 데이터베이스 그룹입니다. 기본 값: default.

  • --namespace - root namespace 설정. 기본 값: APP_NAMESPACE.

  • --suffix - 클래스 이름에 구성 요소 제목을 추가합니다.

마이그레이션 환경 설정

다음은 app/Config/Migrations.php에서 사용 가능한 마이그레이션에 대한 모든 구성 옵션 표입니다.

Preference

Default

Options

Description

enabled

true

true / false

마이그레이션을 활성화 또는 비활성화

table

migrations

None

스키마 버전 번호를 저장하기 위한 테이블 이름

timestampFormat

Y-m-d-His_

마이그레이션을 만들 때 타임 스탬프에 사용할 형

Class Reference

class CodeIgniter\Database\MigrationRunner
findMigrations()
Returns

마이그레이션 파일의 배열

Return type

array

path 속성에있 는 마이그레이션 파일 이름 배열이 반환됩니다.

latest($group)
Parameters
  • $group (mixed) – 데이터베이스 그룹 이름, null이 사용되는 경우 기본 데이터베이스 그룹

Returns

true면 성공, flase면 실패

Return type

bool

네임스페이스 (또는 모든 네임스페이스)에 대한 마이그레이션을 찾고 아직 실행되지 않은 마이그레이션을 결정하고, 버전(혼합된 네임스페이스) 순서대로 실행합니다.

regress($targetBatch, $group)
Parameters
  • $targetBatch (int) – 이전 배치로 마이그레이션; 1+는 배치를 지정하고, 0은 모두 되돌리기, 음수는 상대 배치를 나타냅니다 (예 : -3은 “세 개의 배치를 의미합니다”).

  • $group (?string) – 데이터베이스 그룹 이름, null이 사용되는 경우 기본 데이터베이스 그룹

Returns

true면 성공, flase면 실패 또는 이전 마이그레이션이 없음

Return type

bool

회기(Regress)를 사용하여 변경 사항을 배치별 이전 상태로 롤백할 수 있습니다.

<?php

$migration->regress(5);
$migration->regress(-1);
force($path, $namespace, $group)
Parameters
  • $path (mixed) – 유효한 마이그레이션 파일의 경로

  • $namespace (mixed) – 제공된 마이그레이션의 네임스페이스

  • $group (mixed) – 데이터베이스 그룹 이름, null이 사용되는 경우 기본 데이터베이스 그룹

Returns

true면 성공, flase면 실패

Return type

bool

순서나 배치에 관계없이 단일 파일이 마이그레이션됩니다. 이미 마이그레이션되었는지 여부에 따라 “up” 또는 “down” 메소드가 감지됩니다.

Note

이 메소드는 테스트에만 권장되며 데이터 일관성 문제가 발생할 수 있습니다.

setNamespace($namespace)
Parameters
  • $namespace (string|null) – 어플리케이션 네임스페이스. null은 모든 네임스페이스

Returns

MigrationRunner instance

Return type

CodeIgniter\Database\MigrationRunner

라이브러리에서 마이그레이션 파일을 찾아야 하는 네임스페이스를 설정합니다.

<?php

$migration->setNamespace($namespace)->latest();

Note

null을 설정하면 모든 네임스페이스에서 마이그레이션 파일을 찾습니다.

setGroup($group)
Parameters
  • $group (string) – 데이터베이스 그룹 이름

Returns

MigrationRunner instance

Return type

CodeIgniter\Database\MigrationRunner

라이브러리에서 마이그레이션 파일을 찾을 그룹을 설정합니다.

<?php

$migration->setGroup($group)->latest();