Изменить таблицу в сценарии установки Magento без использования SQL
Джонатон День говорит
"обновления не должны быть в виде
SQL-команды". Я еще не сталкивался
любые состояния DDL или DML, которые не могут
быть выполнена с помощью Magento в конфиг
структуры.
(вопрос как я могу перенести изменения конфигурации из среды разработки в производственную среду?)
Я хотел бы знать, как лучше добавить/изменить/удалить столбец или индекс в/из таблицы в этом манера, но без опоры на SQL? Это вообще возможно?
кроме того, какие другие действия могут быть выполнены только в SQL?
3 ответов:
вы можете использовать такие методы, в свой установочный скрипт:
использовать
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), etc)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. Этот параметр является необязательным, поэтому значение по умолчанию:indexdropColumn()метод используется для удаления столбцов из существующая таблица. Он имеет такие параметры:
$tableName- имя таблицы, которое должно быть изменено$columnName- имя столбца, который должен быть удаленdropForeignKey()метод используется для удаления внешних ключей. Он имеет такие параметры:
$tableName- имя таблицы для удаления внешнего ключа$fkName- имя внешнего ключаdropKey()метод используется для удаление индексов таблицы. Он имеет такие параметры:
$tableName- имя таблицы, где индекс должен быть удален$keyName- имя индексаmodifyColumnспособ используется для изменения существующего столбца в таблице. Он имеет такие параметры:
$tableName- имя таблицы, которое должно быть изменено$columnName- имя столбца, который должен быть переименован$definition- новый определение столбца (INT(10),DECIMAL(12,4), etc)changeColumnметод используется для изменения и переименования существующего столбца в таблице. Он имеет такие параметры:
$tableName- имя таблицы, которое должно быть изменено$oldColumnName- старое имя столбца, которое должно быть переименовано и изменено$newColumnName- новое имя столбца$definition- новое определение столбца (INT(10),DECIMAL(12,4), и т. д.)changeTableEngineметод используется для изменения движка таблицы, от MyISAM до InnoDB, например. Он имеет такие параметры:
$tableName- имя таблицы$engine- новое имя двигателя (MEMORY,MyISAM,InnoDB, etc)также вы можете использовать
tableColumnExistsметод проверки существования столбца.это не полный список доступных методов для вас, чтобы избавиться от прямого написания SQL-запросов. Вы можете найти больше на
Varien_Db_Adapter_Pdo_MysqlиZend_Db_Adapter_Abstractклассы.не стесняйтесь заглянуть в определение класса, который вы собираетесь использовать, вы можете найти много интересного для себя :)
идея о том, что любые обновления Magento не должны включать SQL, основана на идее, что
объекты Magento предоставляют абстракции поверх слоя базы данных/хранилища данных
вы должны использовать абстракции для обновления Magento, что гарантирует, что если команда Magento изменит способ взаимодействия объектов с хранилищем данных, ваши обновления будут по-прежнему работать (при условии, что основная команда поддерживает исходные "контракты", подразумеваемые объектом методы)
Итак, проблема-это
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.
Comments