In theory, yes. I have seen upgrade scripts run multiple times - which is why any upgrade script I create that loads CMS, EAV or other Attribute information typically is coded to safeguard against multiple insertion.
Best Practice:
Using SSH, run the following from your Magento document root:
touch maintenance.flag
This will create a file called 'maintenance.flag' in your Magento root that will effectively pull your store offline during this upgrade. 5 minutes of downtime should be relatively safe if you run in your off-peak or overnight hours.
Upgrade your Magento Store by running an update/pull from your source control checkout or via your preferred method of deployment. To execute your upgrade you can issue:
php index.php
- again from the document root. This will kick off your upgrade.
You can allow yourself access to the CMS portion (if you rather not run the upgrade script yourself via SSH) by implementing an index.php workaround (read: hack) that allows specific IP addresses access by skipping the check of the maintenance.flag file:
$ip = $_SERVER['REMOTE_ADDR'];
$allowed = array('1.1.1.1','2.2.2.2'); // these are the IP's allowed
And replace this line:
if (file_exists($maintenanceFile)) {
with this line:
if (file_exists($maintenanceFile) && !in_array($ip, $allowed)) {
Source: http://inchoo.net/ecommerce/magento/maintenance-mode-in-magento/
In short, recovery to clean up multiple executions of the upgrade will potentially result in longer downtime than if you had just taken the store down to begin with. Plan your maintenance and practice it in your staging environment many times before executing your upgrade.
This is a classic case where code-generation is your friend. Stop creating these by hand, and try using the following free and open source script, (which has also been incorporated into the n98-magerun
tool)
For example, the following will duplicate the sample data's color attribute
$ magento-create-setup.php color
//WARNING, non false value detected in is_used_for_price_rules. The setup resource migration scripts may not support this (per 1.7.0.1)
<?php
if(! ($this instanceof Mage_Catalog_Model_Resource_Setup) )
{
throw new Exception("Resource Class needs to inherit from " .
"Mage_Catalog_Model_Resource_Setup for this to work");
}
$attr = array (
'attribute_model' => NULL,
'backend' => '',
'type' => 'int',
'table' => '',
'frontend' => '',
'input' => 'select',
'label' => 'Color',
'frontend_class' => '',
'source' => '',
'required' => '0',
'user_defined' => '1',
'default' => '',
'unique' => '0',
'note' => '',
'input_renderer' => NULL,
'global' => '1',
'visible' => '1',
'searchable' => '1',
'filterable' => '1',
'comparable' => '1',
'visible_on_front' => '0',
'is_html_allowed_on_front' => '0',
'is_used_for_price_rules' => '1',
'filterable_in_search' => '1',
'used_in_product_listing' => '0',
'used_for_sort_by' => '0',
'is_configurable' => '1',
'apply_to' => 'simple',
'visible_in_advanced_search' => '1',
'position' => '1',
'wysiwyg_enabled' => '0',
'used_for_promo_rules' => '1',
'option' =>
array (
'values' =>
array (
0 => 'Green',
1 => 'Silver',
2 => 'Black',
3 => 'Blue',
4 => 'Red',
5 => 'Pink',
6 => 'Magenta',
7 => 'Brown',
8 => 'White',
9 => 'Gray',
),
),
);
$this->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'color', $attr);
If you're using the n98-magerun
version, that'd be
$ n98-magerun dev:setup:script:attribute catalog_product color
Using code generation will let you get your job done quicker, and as time goes on you'll start to learn the format.
Best Answer
I realised that calling $installer->getConnection() for each column made it working.
etc..