php alter문 - SQL을 사용하지 않고 Magento 설정 스크립트의 ALTER TABLE




명령어 modify (4)

모든 Magento 업데이트에 SQL이 포함되어서는 안된다는 생각은

  1. Magento Objects는 데이터베이스 / 데이터 저장소 계층의 추상화를 제공합니다.

  2. Magento 팀이 개체가 데이터 저장소와 상호 작용하는 방식을 변경하고 업데이트가 계속 작동하도록 보장하는 추상화를 사용하여 Magento를 업데이트해야합니다 (핵심 팀이 Object 메서드에서 암시 한 원래의 "계약"을 유지 관리한다고 가정)

따라서 문제는 ALTER TABLE 문이 직접 데이터 저장소를 변경 한다는 것입니다. 위의 두 가지 아이디어에만 독점적으로 가입하는 경우 데이터 저장소를 변경해서는 안됩니다. (EAV 모델을 독점적으로 사용하여 열 또는 인덱스를 추가하는 경우 설정 리소스를 사용하여 변경 내용을 관리하고 Magento의 인덱싱을 수락 함).

일반적인 Magento 핵심 기능 (제품, 리뷰 등)을 변경하거나 추가하는 경우 업그레이드 중에 신중하게 관리하려는 경우가 아니면 데이터베이스 구조를 직접 변경하지 마십시오.

새로운 개체와 기능을 만들려면 설치 리소스를 통해 테이블을 만들고 변경하려는 모든 SQL을 사용하십시오. 설치 프로그램 / 업그레이드 파일을 보면 핵심 Magento 팀이 직접 수행한다는 것을 알 수 있습니다.

조나단 데이가 말한다.

"업데이트는 SQL 명령의 형식이어야합니다". Magento의 구성 구조를 통해 실행할 수없는 DDL 또는 DML 구문을 발견하지 못했습니다.

(질문 : 어떻게 구성 변경 사항을 개발 환경에서 프로덕션 환경으로 마이그레이션 할 수 있습니까? )

이 방법으로 테이블에 열 또는 인덱스를 추가 / 수정 / 제거하는 것이 가장 좋지만 SQL을 사용하지 않는 방법을 알고 싶습니다. 심지어 가능할까요?

또한 SQL에서만 수행 할 수있는 다른 조치는 무엇입니까?


설정 스크립트 내에서 다음과 같은 방법을 사용할 수 있습니다.

  • Varien_Db_Ddl_Table 클래스를 사용하여 $this->getConnection()->createTable($tableObject) 와 결합하여 모든 필드, 키 및 관계를 구성 할 수있는 새 테이블을 만듭니다. 예제 :

    /* @var $this Mage_Core_Model_Resource_Setup */
    $table = new Varien_Db_Ddl_Table();
    $table->setName($this->getTable('module/table'));
    $table->addColumn('id', Varien_Db_Ddl_Table::TYPE_INT, 10, 
                      array('unsigned' => true, 'primary' => true));
    
    $table->addColumn('name', Varien_Db_Ddl_Table::TYPE_VARCHAR, 255);
    $table->addIndex('name', 'name');
    $table->setOption('type', 'InnoDB');
    $table->setOption('charset', 'utf8');
    
    $this->getConnection()->createTable($table);
    
  • setup connection ( $this->getConnection() ) 메소드를 사용하십시오 :

    • addColumn() 메소드는 기존 테이블에 새로운 컬럼을 추가합니다. 다음과 같은 매개 변수가 있습니다.
      • $tableName - 수정해야 할 테이블 이름
      • $columnName - 추가해야하는 열의 이름
      • $definition - 열 ( INT(10) , DECIMAL(12,4) 등)의 정의
    • addConstraint() 메소드는 새로운 제한 외래 키를 작성합니다. 그런 매개 변수를 가지고있다.
      • $fkName - 외래 키 이름은 데이터베이스마다 고유해야합니다. FK_ 접두어를 지정하지 않으면 자동으로 추가됩니다
      • $tableName - 외래 키를 추가하기위한 테이블 이름
      • $columnName - 다른 테이블을 참조해야하는 열 이름. 복잡한 외래 키가있는 경우 쉼표를 사용하여 두 개 이상의 열을 지정합니다.
      • $refTableName - 처리 될 외부 테이블 이름
      • $refColumnName - 외부 테이블의 열 이름
      • $onDelete - 외부 테이블의 행 제거 작업. 빈 문자열 (아무 것도하지 않음) 일 수도 있고, cascade , set null 있습니다. 이 필드는 선택 사항이며, 지정하지 않으면 cascade 값이 사용됩니다.
      • 외부 테이블의 행 키 업데이트에 대한 $onUpdate 작업. 빈 문자열 (아무 것도하지 않음) 일 수도 있고, cascade , set null 있습니다. 이 필드는 선택 사항이며, 지정하지 않으면 cascade 값이 사용됩니다.
      • $purge - 외래 키 추가 후 행을 정리할 수있는 플래그 (예 : 참조되지 않은 레코드 제거)
    • addKey() 메소드는 테이블에 인덱스를 추가하는 데 사용됩니다. 다음과 같은 매개 변수가 있습니다.
      • $tableName - 인덱스를 추가해야하는 테이블 이름
      • $indexName - 인덱스 명
      • $fields - 색인에 사용 된 열 이름
      • $indexType - 인덱스의 형태. 가능한 값은 index , unique , primary , fulltext 입니다. 이 매개 변수는 선택 사항이므로 기본값은 index
    • dropColumn() 메서드는 기존 테이블에서 열을 제거하는 데 사용됩니다. 다음과 같은 매개 변수가 있습니다.
      • $tableName - 수정해야 할 테이블 이름
      • $columnName - 제거해야하는 열의 이름
    • dropForeignKey() 메서드는 외래 키를 제거하는 데 사용됩니다. 다음과 같은 매개 변수가 있습니다.
      • $tableName - 외래 키를 삭제하기위한 테이블 이름
      • $fkName - 외래 키 이름
    • dropKey() 메서드는 테이블 인덱스를 제거하는 데 사용됩니다. 다음과 같은 매개 변수가 있습니다.
      • $tableName - 색인을 제거해야하는 테이블 이름
      • $keyName - 인덱스 명
    • modifyColumn 메서드는 테이블의 기존 열을 수정하는 데 사용됩니다. 다음과 같은 매개 변수가 있습니다.
      • $tableName - 수정해야 할 테이블 이름
      • $columnName - 이름을 변경해야하는 열의 이름
      • $definition - 열의 새로운 정의 ( INT(10) , DECIMAL(12,4) 등)
    • changeColumn 메서드는 테이블의 기존 열을 수정하고 이름을 바꾸는 데 사용됩니다. 다음과 같은 매개 변수가 있습니다.
      • $tableName - 수정해야 할 테이블 이름
      • $oldColumnName - 이름을 변경하고 수정해야하는 열의 이전 이름
      • $newColumnName - 열의 새로운 이름
      • $definition - 열의 새로운 정의 ( INT(10) , DECIMAL(12,4) 등)
    • changeTableEngine 메소드는 테이블 엔진을 MyISAM에서 InnoDB로 변경하는 데 사용됩니다. 다음과 같은 매개 변수가 있습니다.
      • $tableName - 테이블 이름
      • $engine - 새로운 엔진 이름 ( MEMORY , MyISAM , InnoDB 등)

또한 tableColumnExists 메서드를 사용하여 열의 존재를 확인할 수 있습니다.

직접 SQL 쿼리 작성을 없애기 위해 사용할 수있는 방법의 전체 목록은 아닙니다. Varien_Db_Adapter_Pdo_MysqlZend_Db_Adapter_Abstract 클래스에서 자세한 내용을 확인할 수 있습니다.

당신이 사용하려고하는 클래스 정의를 조사하는 것을 망설이지 말고, 당신 스스로 흥미로운 것들을 많이 찾을 수 있습니다 :)


테이블을 변경하고 외래 키가있는 열을 추가하려면 Magento CE v1.6.1.0을 사용하여이 키를 성공적으로 사용했습니다.

// Alter table to add column
$installer->getConnection()

        ->addColumn(
            $installer->getTable('modulekey/model'), 
            'column_name',  
            array(
                'type'      => Varien_Db_Ddl_Table::TYPE_INTEGER,
                'length'    => null,
                'unsigned'  => true,
                'nullable'  => true,
                'comment'   => 'Foreign key'
            )
        );

// Add foreign key constraint
$installer->getConnection()

        ->addForeignKey(
            $installer->getFkName( 
                'modulekey/model',  'column_name',
                'modulekey/foreign_model',  'foreign_column_name'
            ),
            $installer->getTable('modulekey/model'), 
            'column_name',
            $installer->getTable('modulekey/foreign_model'),
            'foreign_column_name',
            Varien_Db_Ddl_Table::ACTION_SET_NULL, 
            Varien_Db_Ddl_Table::ACTION_SET_NULL
        );

그것들은 Varien_Db_Adapter_Pdo_Mysql 메소드입니다.


하나는 자동 증가 열을 만들 수 있습니다 (적어도 Magento 1.6부터, 어쩌면 더 일찍) :

/** @var $table Varien_Db_Ddl_Table */
$table->addColumn( 'id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
    'auto_increment' => true,
    'unsigned' => true,
    'nullable' => false,
    'primary' => true,
), 'ID' );

"auto_increment"대신 "identity"키워드를 사용할 수도 있습니다.





php sql magento installation entity-attribute-value