54 votes

ALTER TABLE dans Magento script d'installation sans l'aide de SQL

Jonathon Jour dit

"les mises à jour ne DEVRAIT PAS être dans la forme de Les commandes SQL". Je n'ai pas rencontré de tout DDL ou DML relevés qui ne peuvent pas être exécuté via Magento config les structures.

(Dans la question Comment puis-je migrer les modifications de la configuration de développement à l'environnement de production?)

Je voudrais savoir comment ajouter/modifier/supprimer une colonne ou d'un index/d'une table de cette manière, mais sans compter sur SQL? Est-il même possible?

En outre, quelles sont les autres actions ne peut être fait en SQL?

128voto

Ivan Chepurnyi Points 6356

Vous pouvez utiliser ces méthodes dans votre script d'installation:

  • Utiliser Varien_Db_Ddl_Table de la classe à créer de nouvelles tables, où vous pouvez configurer tous les domaines, les clés, les relations en combinaison avec d' $this->getConnection()->createTable($tableObject) Exemple:

    /* @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);
    
  • Utilisez la connexion de la configuration ($this->getConnection()) méthodes:

    • addColumn() méthode ajoute une nouvelle colonne à la sortie de table. Il a de ces paramètres:
      • $tableName - le nom de la table qui doit être modifié
      • $columnName- le nom de la colonne, qui devrait être ajouté
      • $definition - définition de la colonne (INT(10), DECIMAL(12,4), etc)
    • addConstraint() méthode crée une nouvelle contrainte de clé étrangère. Il a de ces paramètres
      • $fkName - l'écart nom de clé doit être unique pour chaque base de données, si vous ne spécifiez FK_ préfixe, il sera ajouté automatiquement
      • $tableName - le nom de la table pour l'ajout d'une clé étrangère
      • $columnName - le nom de la colonne qui doit être référencé à l'autre de la table, si vous avez des complexes de clé étrangère, utilisez une virgule pour spécifier plus d'une colonne
      • $refTableName - l'étranger nom de la table, qui seront traitées
      • $refColumnName - le nom de la colonne(s) dans la table étrangère
      • $onDelete - action sur la ligne la suppression dans la table étrangère. Peut être une chaîne vide (ne rien faire), cascade, set null. Ce champ est optionnel, et si il n'est pas spécifié, cascade valeur sera utilisée.
      • $onUpdate d'action sur la touche de ligne de mise à jour dans la table étrangère. Peut être une chaîne vide (ne rien faire), cascade, set null. Ce champ est optionnel, et si il n'est pas spécifié, cascade valeur sera utilisée.
      • $purge - un drapeau pour permettre le nettoyage des lignes après que la clé étrangère de l'ajout (par exemple retirer les recodrs qui ne sont pas référencés)
    • addKey() méthode est utilisée pour l'ajout d'index à une table. Il a de ces paramètres:
      • $tableName - le nom de la table où l'indice devrait être ajouté
      • $indexName - le nom de l'index
      • $fields - nom de la colonne(s) utilisée dans l'index
      • $indexType - type de l'indice. Les valeurs possibles sont: index, unique, primary, fulltext. Ce paramètre est facultatif, de sorte que la valeur par défaut est index
    • dropColumn() méthode est utilisée pour enlever des colonnes de la table existante. Il a de ces paramètres:
      • $tableName - le nom de la table qui doit être modifié
      • $columnName- le nom de la colonne, qui devrait supprimé
    • dropForeignKey() méthode est utilisée pour la suppression de l'écart de touches. Il a de ces paramètres:
      • $tableName - le nom de la table pour la suppression d'une clé étrangère
      • $fkName - l'écart nom de la clé
    • dropKey() méthode est utilisée pour enlever de la table d'index. Il a de ces paramètres:
      • $tableName - le nom de la table où l'indice doit être supprimé
      • $keyName - le nom de l'index
    • modifyColumn méthode est utilisée pour modifier les colonnes dans le tableau. Il a de ces paramètres:
      • $tableName - le nom de la table qui doit être modifié
      • $columnName- le nom de la colonne, qui devrait être renommé
      • $definition - une nouvelle définition de la colonne (INT(10), DECIMAL(12,4), etc)
    • changeColumn méthode est utilisée pour modifier et renommer colonne existante dans la table. Il a de ces paramètres:
      • $tableName - le nom de la table qui doit être modifié
      • $oldColumnName- l'ancien nom de la colonne, qui devrait être renommé et modifié
      • $newColumnName- un nouveau nom de la colonne
      • $definition - une nouvelle définition de la colonne (INT(10), DECIMAL(12,4), etc)
    • changeTableEngine méthode est utilisée pour modifier la table de moteur, de MyISAM pour InnoDB par exemple. Il a de ces paramètres:
      • $tableName - le nom de la table
      • $engine - nouveau nom du moteur (MEMORY, MyISAM, InnoDB, etc)

Aussi, vous pouvez utiliser tableColumnExists méthode de vérification de l'existance de la colonne.

Ce n'est pas la liste complète des méthodes qui sont disponibles pour vous, pour se débarrasser de les requêtes SQL directes de l'écriture. Vous pouvez trouver plus à l' Varien_Db_Adapter_Pdo_Mysql et Zend_Db_Adapter_Abstract les classes.

N'hésitez pas à regarder dans la définition de la classe dont vous allez utiliser, vous pouvez trouver beaucoup de intresting choses pour vous-même :)

18voto

Alan Storm Points 82442

L'idée que toute les mises à jour de Magento ne DEVRAIT PAS inclure SQL est basé sur l'idée que

  1. Magento Objets fournissent des abstractions sur le dessus de votre base de données/la banque de données de la couche

  2. Vous devez utiliser les abstractions de mise à jour de Magento, qui assure si l'équipe Magento modifie la manière dont les objets interagissent avec la banque de données, les mises à jour continuent de fonctionner (en supposant que le noyau de l'équipe conserve l'original "contrat" tacite par les méthodes de l'Objet)

Donc, le problème est un ALTER TABLE déclaration directement les modifications de la base de données. Si vous vous abonnez exclusivement à ces deux idées, vous ne devriez jamais modifier la banque de données. (qui, dans le cas de l'ajout d'une colonne ou d'un indice moyen à l'aide VAE modèles exclusivement, à l'aide de la Configuration des Ressources de gestion des modifications, et en acceptant de Magento indexation).

Une bonne règle générale est, si vous êtes de modifier ou d'ajouter sur un core de Magento fonctionnalité (Produits, des Examens, etc.), rester à l'écart de modifier directement la structure de base de données, sauf si vous êtes prêt à gérer rigoureusement lors de mises à jour.

Si vous êtes à la construction de nouveaux objets et des fonctionnalités utilisent quel que soit le SQL que vous voulez créer et modifier vos tables par le biais de Ressources du programme d'Installation. Si vous regardez le programme d'installation/de mise à niveau des fichiers, vous pouvez voir que le noyau de l'équipe Magento est-ce à eux-mêmes.

12voto

Bouni Points 116

Pour modifier la table et ajouter une colonne avec une clé étrangère, j'ai utilisé avec succès à l'aide de 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
        );

Ceux sont des méthodes d' Varien_Db_Adapter_Pdo_Mysql.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X