web-dev-qa-db-ja.com

SQLを使用しないMagentoセットアップスクリプトのALTER TABLE

Jonathon Day 言う

「更新はSQLコマンドの形式にしないでください」。 Magentoの設定構造を介して実行できないDDLまたはDMLの文言はありません。

(質問で 構成の変更を開発環境から運用環境に移行するにはどうすればよいですか?

この方法でテーブルに列またはインデックスを追加/変更/削除する最良の方法を知りたいのですが、SQLに依存しませんか?それも可能ですか?

さらに、SQLでしか実行できない他のアクションは何ですか?

54
clockworkgeek

セットアップスクリプト内でこのようなメソッドを使用できます。

  • _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);
    _
  • 接続のセットアップ($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_-インデックスのタイプ。指定可能な値は、indexuniqueprimaryfulltextです。このパラメーターはオプションであるため、デフォルト値は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_-新しいエンジン名(MEMORYMyISAMInnoDBなど)

また、tableColumnExistsメソッドを使用して列の存在を確認できます。

直接的なSQLクエリの記述をなくすために利用できるメソッドの完全なリストではありません。 _Varien_Db_Adapter_Pdo_Mysql_および_Zend_Db_Adapter_Abstract_クラスで詳細を見つけることができます。

使用するクラス定義をdefinitionすることをlookしないでください、あなた自身のために多くの興味深いものを見つけることができます:)

128
Ivan Chepurnyi

Magentoの更新にはSQLを含めるべきではないという考え方は、次の考え方に基づいています。

  1. Magentoオブジェクトは、データベース/データストアレイヤーの上に抽象化を提供します

  2. 抽象化を使用してMagentoを更新する必要があります。これにより、Magentoチームがオブジェクトとデータストアとの対話方法を変更しても、更新は引き続き機能します(コアチームがObjectメソッドによって暗示される元の「契約」を維持すると仮定)

したがって、問題はALTER TABLEステートメント直接変更データストア。上記の2つのアイデアのみをサブスクライブする場合は、データストアを変更しないでください。 (列またはインデックスを追加する場合、EAVモデルのみを使用し、セットアップリソースを使用して変更を管理し、Magentoのインデックス作成を受け入れます)。

一般的な目安として、Magentoのコア機能(製品、レビューなど)を変更または追加する場合、アップグレード中にデータベース構造を慎重に管理しない限り、データベース構造を直接変更しないでください。

新しいオブジェクトと機能を構築する場合は、セットアップリソースを使用してテーブルを作成および変更する任意のSQLを使用します。インストーラ/アップグレードファイルを見ると、Magentoのコアチームがこれを行っていることがわかります。

18
Alan Storm

テーブルを変更し、外部キーを持つ列を追加するには、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のメソッドです。

12
Bouni