Джонатан Дэй говорит
«обновления НЕ ДОЛЖНЫ быть в форме команд SQL». Я не сталкивался с любыми статусами DDL или DML, которые не могут быть выполнены через конфигурационные структуры Magento.
(В вопросе Как перенести изменения конфигурации из среды разработки в производственную среду? )
Я хотел бы знать, как лучше добавлять / изменять / удалять столбцы или индексы в / из таблицы таким образом, но не полагаясь на 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);
Используйте установочное соединение ( $this->getConnection()
):
addColumn()
добавляет новый столбец в выходящую таблицу. Он имеет такие параметры:
$tableName
– имя таблицы, которое должно быть изменено $columnName
– имя столбца, которое должно быть добавлено $definition
– определение column ( 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_Mysql
и Zend_Db_Adapter_Abstract
.
Не стесняйтесь смотреть на определение класса, которое вы собираетесь использовать, вы можете найти для себя много интересного 🙂
Идея о том, что любые обновления Magento НЕ ДОЛЖНЫ включать SQL, основана на идее, что
Объекты Magento предоставляют абстракции поверх уровня базы данных / хранилища данных
Вы должны использовать абстракции для обновления Magento, что гарантирует, что команда Magento изменит способ взаимодействия объектов с хранилищем данных, ваши обновления все равно будут работать (при условии, что основная команда поддерживает исходные «контракты», подразумеваемые методами Object)
Таким образом, проблема в выражении ALTER TABLE
напрямую изменяет хранилище данных. Если вы подписываетесь исключительно на эти две идеи, вы никогда не должны менять хранилище данных. (что в случае добавления столбца или индекса означает использование только моделей EAV, использование ресурсов установки для управления изменениями и принятие индексации Magento).
Хорошим общим правилом является то, что если вы меняете или добавляете некоторые функциональные возможности Magento (продукты, обзоры и т. Д.), Избегайте прямого изменения структуры базы данных, если только вы не захотите тщательно управлять ею во время обновлений.
Если вы создаете новые объекты и функции, используйте любой SQL, который вы хотите создать и измените ваши таблицы через Ресурсы установки. Если вы посмотрите на файлы установщика / обновления, вы увидите, что основная команда Magento делает это самостоятельно.
Чтобы изменить таблицу и добавить столбец с помощью внешнего ключа, я использовал это успешно, используя 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
.