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
Los objetos de Magento proporcionan abstracciones encima de la capa de base de datos / almacén de datos
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étodoaddColumn()
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étodoaddConstraint()
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 prefijoFK_
, 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 encascade
. -
$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 encascade
. -
$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étodoaddKey()
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 esindex
-
-
dropColumn()
métododropColumn()
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étododropForeignKey()
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étododropKey()
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étodomodifyColumn
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étodochangeColumn
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étodochangeTableEngine
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 :)