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


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

    좋은 웹페이지 즐겨찾기