command line을 이용해서, 바로 직접적으로 migrate를 실행하는 방법과 웹 브라우저에서 요청을 받아 controller에서 migrate하는 두 가지 방법을 알아보겠습니다.
Command Line
Table 생성
php spark make:migration create_task
spark 명령어를 이용해서 간ㅍ편히 migration 파일을 만들 수 있습니다.
migration file명에는 타임스템프 값이 추가되어있습니다.
예 ) 2022-02-28-105116_CreateTask.php
Migrate명령어를 실행하면, 타임라인에 따라 생성일 순서대로 실행이되기 migration의 파일 생성 순서는 중요합니다.
예를 들어서 Task라는 Table과 User라는 Table 두 개가 존재하는데, Task에서 User의 id을 참조키로 지정할려고 합니다.
그런데, Task의 migration파일을 먼저 생성해버리면, 존재하지도 않는 User Table을 참조하기 때문에 오류가 발생합니다.
2022-02-28-105116_CreateTask.php
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class CreateTask extends Migration
{
public function up()
{
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 5,
'unsigned' => true,
'auto_increment' => true
],
'description' => [
'type' => 'VARCHAR',
'constraint' => '128',
],
]);
$this->forge->addPrimaryKey('id');
$this->forge->createTable('task');
}
public function down()
{
$this->forge->dropTable('task');
}
}
codeigniter 의 forge 클래스를 통해서 DB에 접근할 수 있습니다.
그리고, 처음에 migration파일을 생성하면 up()과 down() 두 개의 method가 생성됩니다.
up()은 migrate할 때 실행되는 method이고, down()은 rollback할 때 실행되는 method 입니다.
우선 Table을 생성할 때에는 forge 클래스의 addField 메소드를 이용합니다.
스키마 정의
'id' => [
'type' => 'INT',
'constraint' => 5,
'unsigned' => true,
'auto_increment' => true
]
연관배열 형태로, columnd의 이름, 그리고 column에 대한 type등 여러 스키마를 정의합니다.
primary키 설정
$this->forge->addPrimaryKey('id');
Table 이름설정 & 생성
$this->forge->createTable('task');
Table 삭제
public function down()
{
$this->forge->dropTable('task');
}
rollback 명령을 실행하면, task이름의 table을 삭제합니다.
Migrate 실행
php spark migrate
phpmyadmin에서 확인해보면, task와 migrations라는 테이블 생성된 것을 볼 수 있습니다.
migrations는 migrate 명령어를 실행할 떄 자동으로 생성되어, migrate 명령어로 생성한 table등을 관리할 수 있습니다.
Controller로 Migrate 실행
Table column 추가
2022-03-06-093336_AddTimestampsToTask.php
타임스탬프_migration이름.php 형식으로 파일을 생성합니다.
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AddTimestampsToTask extends Migration
{
public function up()
{
}
public function down()
{
}
}
위와 같은 뼈대로 만들어 줍니다.
$this->forge->addColumn('task', [
'created_at' => [
'type' => 'TIMESTAMP',
'null' => true,
'default' => null,
],
'updated_at' => [
'type' => 'TIMESTAMP',
'null' => true,
'default' => null,
],
]);
column 추가를 위해서 forge 클래스의 addColumn 메소드를 사용합니다.
addColumn( 테이블 이름, 추가할 컬럼 )
public function down()
{
$this->forge->dropColumn('task', 'created_at');
$this->forge->dropColumn('task', 'updated_at');
}
rollback할 떄 실행되는 down 메소드에는 dropColumn을 통해서 위에서 addColumn에 추가할려고한 column을 다시
dropColumn으로 삭제되도록 설정합니다.
Contrller 설정
Migrate.php
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
class Migrate extends BaseController
{
public function index()
{
$migrate = service('migrations');
try {
$migrate->latest();
echo "migrated";
} catch (\Exception $e) {
echo $e->getMessage();
}
}
}
controller에서 migrate하기 위해서 migrations 서비스를 변수에 선언합니다.
$migrate->latest()를 실행하면 데이터베이스를 최신 상태로 전환합니다.
실패했을 경우에는 예외를 발생하기 때문에 try/catch를 통해 실행을 합니다.
migrate 컨트롤러의 index 메소드이므로 app/migrate로 접근하면, 해당 컨트롤러가 실행되고,
정상적으로 실행이되어 migrated가 출력이 된 것을 확인할 수 있습니다.
phpmyadmin
Task table의 구성을 확인해보면, created_at과 updated_at 컬럼이 추가된 것을 확인할 수 있습니다.
이렇듯, migrate 작업은 controller / command 두 가지를 이용해서 실행하는 것이 가능합니다.
'IT 공부 > CodeIgniter' 카테고리의 다른 글
[ codeigniter 4 ] Model의 return 타팁을 Entity로 변경하기 (0) | 2022.03.09 |
---|---|
[ codeigniter 4 ] Model을 이용해서, DB의 데이터 접근 & 디버그 (0) | 2022.03.08 |
[ Codeigniter ] Codeigniter 4 프로젝트 virtualhost 서버 설정 (0) | 2022.02.28 |
[ Codeigniter 4 ] GoogleのKeyword広告クローラー (0) | 2022.01.21 |
[ codeigniter 4 ] 더보기를 클릭하면, ajax를 통해서 목록 불러오기 (0) | 2022.01.05 |