ALTERAR la TABLA en el script de configuración de Magento sin usar SQL


El día de Jonathon dice

" las actualizaciones NO DEBEN tener la forma de SQL commands". No he encontrado cualquier estado DDL o DML que no pueda ser ejecutado a través de la configuración de Magento estructura.

(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 de una tabla de esta manera, pero sin depender de SQL? Es ¿incluso posible?

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

Author: Community, 2010-11-30

3 answers

Puede utilizar estos métodos dentro de su script de instalación:

  • Use 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 configuración de conexión ($this->getConnection()):

    • addColumn() el método agrega una nueva columna a la tabla de salida. Tiene parámetros:
      • $tableName - el nombre de la tabla que debe modificarse
      • $columnName- el nombre de la columna, que debe se añadirá
      • $definition - definición de la columna (INT(10), DECIMAL(12,4), etc)
    • el método addConstraint() crea una nueva clave foránea de restricción. Tiene parámetros
      • $fkName - el nombre de la clave externa, debe ser único por base de datos, si no se especifica FK_ prefijo, se añadirá automáticamente
      • $tableName - el nombre de la tabla para agregar una clave foránea
      • $columnName - el nombre de la columna que debe referirse a otra tabla, si tiene una clave externa compleja, use coma para especificar más de una columna
      • $refTableName - el nombre de la tabla extranjera, que se manejará
      • $refColumnName - el (los) nombre (s) de la columna en la tabla foránea
      • $onDelete - acción sobre la eliminación de filas 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 utilizará el valor cascade.
      • $onUpdate acción sobre la actualización de la clave de fila 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 utilizará el valor cascade.
      • $purge - un indicador para habilitar la limpieza de las filas después de agregar la clave externa (por ejemplo, eliminar los registros que no se mencionan)
    • addKey() el método se utiliza para agregar índices a una tabla. Tiene parámetros:
      • $tableName - el nombre de la tabla donde se debe agregar el índice
      • $indexName - el nombre del índice
      • $fields - nombre (s) de columna utilizado (s) 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() el método se utiliza para eliminar columnas de la tabla existente. Tiene parámetros:
      • $tableName - el nombre de la tabla que debe modificarse
      • $columnName - el nombre de la columna, que debe eliminarse
    • dropForeignKey() método se utiliza para la eliminación de claves foráneas. Tiene tal parámetros:
      • $tableName - el nombre de la tabla para eliminar una clave foránea
      • $fkName - el nombre de la clave externa
    • dropKey() método se utiliza para la eliminación de los índices de tabla. Tiene parámetros:
      • $tableName - el nombre de la tabla donde se debe eliminar el índice
      • $keyName - el nombre del índice
    • modifyColumn el método se utiliza para modificar la columna existente en la tabla. Tiene 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 se utiliza para modificar y cambiar el nombre de la columna existente en la tabla. Tiene 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 - a nueva definición de la columna (INT(10), DECIMAL(12,4), etc)
    • changeTableEngine el método se utiliza para cambiar el motor de tabla, de MyISAM a InnoDB, por ejemplo. Tiene 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 métodos que están disponibles para usted, para deshacerse de direct Escritura de consultas SQL. Puedes encontrar más en las clases Varien_Db_Adapter_Pdo_Mysql y Zend_Db_Adapter_Abstract.

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

 126
Author: Ivan Chepurnyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-26 16:34:03

La idea de que cualquier actualización de Magento NO DEBE incluir SQL se basa en la idea de que

  1. Los objetos Magento proporcionan abstracciones en la parte superior de su base de datos/capa de almacén de datos

  2. Debe usar las abstracciones para actualizar Magento, lo que garantiza que si el equipo de Magento cambia la forma en que los objetos interactúan con el almacén de datos, sus actualizaciones seguirán funcionando (suponiendo que el equipo central mantenga los "contratos" originales implícitos en los métodos de Objetos)

Así, el 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. (lo que, en el caso de agregar una columna o un índice significa usar modelos EAV exclusivamente, usar los Recursos de Configuración para administrar los cambios y aceptar la indexación de Magento).

Una buena regla general es, si está cambiando o agregando a alguna funcionalidad principal de Magento (Productos, revisiones, etc.).), manténgase alejado de 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 funciones, use el SQL que desee crear y cambie sus tablas a través de los recursos de configuración. Si observa los archivos de instalación / actualización, puede ver que el equipo central de Magento hace esto por sí mismo.

 18
Author: Alan Storm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-30 20:08:02

Para alterar la tabla y agregar columna con una clave externa, he utilizado esto 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.

 12
Author: Bouni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-13 04:37:54