php sql magento installation entity-attribute-value

php - ALTER TABLE en la secuencia de comandos de configuración de Magento sin usar SQL



installation entity-attribute-value (3)

Jonathon Day dice

"las actualizaciones NO DEBERÍAN estar en forma de comandos SQL". No he encontrado ninguna declaración DDL o DML que no se pueda ejecutar a través de las estructuras de configuración de Magento.

(En la pregunta ¿Cómo puedo migrar los cambios de configuración del entorno de desarrollo al de producción? )

Me gustaría saber la mejor manera de agregar / modificar / eliminar una columna o un índice a / desde una tabla de esta manera, pero sin depender de SQL. ¿Es posible?

Además, ¿qué otras acciones solo se pueden hacer en SQL?


La idea de que las actualizaciones de Magento NO DEBEN incluir SQL se basa en la idea de que

  1. Los objetos de Magento proporcionan abstracciones encima de la capa de base de datos / almacén de datos

  2. Debes usar las abstracciones para actualizar Magento, que asegura que si el equipo de Magento cambia la forma en que los objetos interactúan con el almacén de datos, tus actualizaciones seguirán funcionando (asumiendo que el equipo central mantenga los "contratos" originales implicados por los métodos del Objeto)

Entonces, el problema es que una instrucción ALTER TABLE cambia directamente el almacén de datos. Si se suscribe exclusivamente a las dos ideas anteriores, nunca debe cambiar el almacén de datos. (que, en el caso de agregar una columna o un índice, significa usar exclusivamente modelos de EAV, usar los recursos de configuración para administrar los cambios y aceptar la indexación de Magento).

Una buena regla general es que si está cambiando o agregando alguna funcionalidad básica de Magento (Productos, Revisiones, etc.), evite cambiar directamente la estructura de la base de datos a menos que esté dispuesto a administrarla cuidadosamente durante las actualizaciones.

Si está creando nuevos objetos y funcionalidades, utilice el SQL que desee crear y cambie sus tablas a través de los recursos de configuración. Si miras los archivos de instalador / actualización, puedes ver que el equipo central de Magento lo hace por sí mismo.


Para modificar la tabla y agregar una columna con una clave externa, la utilicé con éxito usando 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 );

Esos son métodos de Varien_Db_Adapter_Pdo_Mysql .


Puede usar dichos métodos en su script de instalación:

  • Utilice la clase Varien_Db_Ddl_Table para crear nuevas tablas, donde puede configurar todos los campos, claves, relaciones en combinación con $this->getConnection()->createTable($tableObject) Ejemplo:

    /* @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);

  • Use los métodos de conexión de configuración ( $this->getConnection() ):

    • addColumn() método addColumn() agrega una nueva columna a la tabla de salida. Tiene tales parámetros:
      • $tableName - el nombre de la tabla que debe modificarse
      • $columnName - el nombre de la columna, que debe agregarse
      • $definition - definición de la columna ( INT(10) , DECIMAL(12,4) , etc.)
    • addConstraint() método addConstraint() crea una nueva clave externa de restricción. Tiene tales parámetros
      • $fkName - el nombre de la clave externa, debe ser único por base de datos, si no especifica el prefijo FK_ , se agregará automáticamente
      • $tableName - el nombre de la tabla para agregar una clave externa
      • $columnName - el nombre de la columna que debe remitirse a otra tabla, si tiene una clave externa compleja, use una coma para especificar más de una columna
      • $refTableName - el nombre de la tabla extranjera, que se manejará
      • $refColumnName - el nombre de columna en la tabla extranjera
      • $onDelete - acción en la eliminación de filas en la tabla externa. Puede ser cadena vacía (no hacer nada), cascade , set null . Este campo es opcional, y si no se especifica, se usará el valor en cascade .
      • $onUpdate en la actualización de clave de fila en la tabla foránea. Puede ser cadena vacía (no hacer nada), cascade , set null . Este campo es opcional, y si no se especifica, se usará el valor en cascade .
      • $purge - un indicador para permitir la limpieza de las filas después de agregar una clave externa (por ejemplo, eliminar los registros que no están referenciados)
    • addKey() método addKey() se usa para agregar índices a una tabla. Tiene tales parámetros:
      • $tableName - el nombre de la tabla donde se debe agregar el índice
      • $indexName - el nombre del índice
      • $fields - nombre (s) de columna usados ​​en el índice
      • $indexType - tipo del índice. Los valores posibles son: index , unique , primary , fulltext . Este parámetro es opcional, por lo que el valor predeterminado es index
    • dropColumn() método dropColumn() se usa para eliminar columnas de la tabla existente. Tiene tales parámetros:
      • $tableName - el nombre de la tabla que debe modificarse
      • $columnName - el nombre de la columna, que debe eliminarse
    • dropForeignKey() método dropForeignKey() se usa para eliminar claves externas. Tiene tales parámetros:
      • $tableName - el nombre de la tabla para eliminar una clave foránea
      • $fkName - el nombre de la clave externa
    • dropKey() método dropKey() se usa para eliminar los índices de la tabla. Tiene tales parámetros:
      • $tableName - el nombre de la tabla donde debe eliminarse el índice
      • $keyName - el nombre del índice
    • modifyColumn método modifyColumn se usa para modificar una columna existente en la tabla. Tiene tales parámetros:
      • $tableName - el nombre de la tabla que debe modificarse
      • $columnName - el nombre de la columna, que debe ser renombrado
      • $definition - una nueva definición de la columna ( INT(10) , DECIMAL(12,4) , etc.)
    • changeColumn método changeColumn se usa para modificar y cambiar el nombre de la columna existente en la tabla. Tiene tales parámetros:
      • $tableName - el nombre de la tabla que debe modificarse
      • $oldColumnName - el antiguo nombre de la columna, que debe ser renombrado y modificado
      • $newColumnName - un nuevo nombre de la columna
      • $definition - una nueva definición de la columna ( INT(10) , DECIMAL(12,4) , etc.)
    • changeTableEngine método changeTableEngine se usa para cambiar el motor de la tabla, desde MyISAM a InnoDB, por ejemplo. Tiene tales parámetros:
      • $tableName - el nombre de la tabla
      • $engine : nuevo nombre del motor ( MEMORY , MyISAM , InnoDB , etc.)

También puede usar el método tableColumnExists para verificar la existencia de la columna.

No es la lista completa de los métodos que están disponibles para usted, para deshacerse de la escritura directa de consultas SQL. Puede encontrar más en las clases Varien_Db_Adapter_Pdo_Mysql y Zend_Db_Adapter_Abstract .

No dude en consultar la definición de la clase que va a utilizar, puede encontrar muchas cosas interesantes para usted :)