CakePHP Migrations limit 옵션 정보

7092 단어 PhinxPHPcakephp3
이것은 CakePHP Advent Calendar 2017의 14 일째 기사입니다.
CakePHP 의 슬랙 채널 에서 화제 에 오르고 있었으므로 앞으로 공개합니다.

세 줄


  • CakePHP의 Migrations는, XXXXINT계의 컬럼이 서투른 모양.
  • 우선 대응은 가능.
  • 어쩌면 근본적인 해결을 위해서는 CakePHP 본체의 대응이 필요

  • 발단


    CREATE TABLE `users` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      `gender` tinyint(4) NOT NULL DEFAULT '0',
      `created` datetime,
      `modified` datetime,
      PRIMARY KEY (`id`)
    ); 
    

    위의 schema 로 bake migration_snapshot 한 마이그레이션 파일을 실행하면(자), 이하의 예외가 던져져 마이그레이션을 실행할 수 없다.

    Exception: An invalid column type "tinyinteger"was specified for column "gender". in [/path/to/vendor/robmorgan/phinx/src/Phinx/Db/Table.php, line 351]

    우선 대응 방법



    해당 열의 type을 변경하고 limit에 Phinx 옵션을 설정합니다.
    htp // // cs. p 힌트 x. 오 rg / 엔 / 아 st / 미g 라치온 s. html # ぃみ t 오 p 치 온 - an d mysql
    -            ->addColumn('gender', 'tinyinteger', [
    +            ->addColumn('gender', 'integer', [
                     'default' => '0',
    -                'limit' => 4,
    +                'limit' => Phinx\Db\Adapter\MysqlAdapter::INT_TINY,
                     'null' => false,
                 ])
    

    또는
     <?php
     use Migrations\AbstractMigration;
    +use Phinx\Db\Adapter\MysqlAdapter;
    
    -            ->addColumn('gender', 'tinyinteger', [
    +            ->addColumn('gender', 'integer', [
                     'default' => '0',
    -                'limit' => 4,
    +                'limit' => MysqlAdapter::INT_TINY,
                     'null' => false,
                 ])
    

    다른 타입은?



    다른 type에 대해서도 상황을 확인.
  • ○ : 마이그레이션 파일을 실행할 수 있으며 type 변경도 없습니다.
  • △ : 마이그레이션 파일을 실행할 수 있지만 type이 변경됩니다.
  • error : 마이그레이션 파일을 실행할 수 없습니다.



  • 원래 유형
    결과
    작성된 type


    TINYBLOB
    △
    BINARY(255)

    BLOB
    △
    BINARY(255)

    MEDIUMBLOB
    error

    LONGBLOB
    error

    TINYTEXT
    ○
    TINYTEXT

    TEXT
    ○
    TEXT

    MEDIUMTEXT
    ○
    MEDIUMTEXT

    LONGTEXT
    ○
    LONGTEXT

    TINYINT
    error

    SMALLINT
    error

    MEDIUMINT
    △
    INT(9)

    INT
    ○
    INT

    BIGINT
    ○
    BIGINT


    blob은 binary로 취급됩니다. MEDIUMBLOB, LOGNBLOB의 경우 다음 오류가 발생합니다.

    SQLSTATE[42000]: Syntax error or access violation: 1074 Column length too big for column 'blob_long' (max = 255); use BLOB or TEXT instead

    대응
    -            ->addColumn('blob_long', 'binary', [
    +            ->addColumn('blob_long', 'blob', [
                     'default' => null,
    -                'limit' => 4294967295,
    +                'limit' => Phinx\Db\Adapter\MysqlAdapter::BLOB_LONG,
                     'null' => true,
    

    PostgreSQL의 경우



    SAMLLINT 는 Exception: An invalid column type 가 던진다.
    htp : // cs. p 힌트 x. 오 rg / 엔 / 아 st / 미g 라치온 s. html # ぃみ t 오 p 치 온 - an d po stg re sql
    -            ->addColumn('gender', 'smallinteger', [
    +            ->addColumn('gender', 'integer', [
                     'default' => null,
    -                'limit' => 5,
    +                'limit' => Phinx\Db\Adapter\PostgresAdapter::INT_SMALL,
                     'null' => false,
    

    BIGINT는 구문 오류 ...

    Exception: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "("
    LINE 1: ...users"("id"BIGSERIAL NOT NULL, "big_int"BIGINT (20) NOT N...

    대응
                 ->addColumn('big_int', 'biginteger', [
                     'default' => null,
    -                'limit' => 20,
    +                'limit' => null,
                     'null' => false,
                 ])
    

    요약



    어쩌면 CakePHP 본체의 대응이 필요합니다 ...

    환경


  • CakePHP: 3.5.7
  • CakePHP Migrations: 1.7.1
  • Phinx: 0.8.1
  • PHP: 7.1.0
  • MySQL: 5.7.20
  • PostgreSQL: 10.1


  • 내일은 @ 케이 스케 후나츠씨입니다.

    좋은 웹페이지 즐겨찾기