Изменить таблицу в сценарии установки Magento без использования SQL



Джонатон День говорит




"обновления не должны быть в виде
SQL-команды". Я еще не сталкивался
любые состояния DDL или DML, которые не могут
быть выполнена с помощью Magento в конфиг
структуры.




(вопрос как я могу перенести изменения конфигурации из среды разработки в производственную среду?)



Я хотел бы знать, как лучше добавить/изменить/удалить столбец или индекс в/из таблицы в этом манера, но без опоры на SQL? Это вообще возможно?



кроме того, какие другие действия могут быть выполнены только в SQL?

515   3  

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. Этот параметр является необязательным, поэтому значение по умолчанию:index
    • dropColumn() метод используется для удаления столбцов из существующая таблица. Он имеет такие параметры:
      • $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, основана на идее, что

  1. объекты Magento предоставляют абстракции поверх слоя базы данных/хранилища данных

  2. вы должны использовать абстракции для обновления 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

    Ничего не найдено.