Modifier la TABLE dans le script de configuration de Magento sans utiliser SQL

Jonathon Jour dit

" les mises à jour ne doivent pas prendre la forme de Les commandes SQL". Je n'ai pas rencontré de toute déclaration DDL ou DML qui ne peut pas être exécuté via la configuration de Magento structure.

(dans la question Comment faire passer les changements de configuration du développement à l'environnement de production? )

je voudrais savoir comment mieux 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?

de plus, quelles autres actions ne peuvent être réalisées qu'en SQL?

53
demandé sur Community 2010-11-30 18:54:46

3 réponses

vous pouvez utiliser de telles 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 avec la combinaison $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);
    
  • Utiliser les paramètres de connexion ( $this->getConnection() ) les méthodes:

    • addColumn() la méthode ajoute une nouvelle colonne au tableau sortant. Il a une telle paramètre:
      • $tableName - le nom de la table qui doit être modifié
      • $columnName - le nom de la colonne, qui doit être ajoutée
      • $definition - définition de la colonne ( INT(10) , DECIMAL(12,4) , etc)
    • addConstraint() méthode crée une nouvelle contrainte clé étrangère. Il a de tels paramètres
      • $fkName - le nom de la clé étrangère, devrait être unique par base de données, si vous ne spécifiez pas le préfixe FK_ , il sera ajouté automatiquement
      • $tableName - le nom de la table pour ajouter une clé étrangère
      • $columnName - le nom de la colonne qui doit être référée à une autre table, si vous avez une clé étrangère complexe, utilisez virgule pour spécifier plus d'une colonne
      • $refTableName - le nom de la table étrangère, qui sera traitée
      • $refColumnName - le(S) nom (s) de colonne dans la table étrangère
      • $onDelete - action sur la rangée enlevant dans la table étrangère. Peut être une chaîne vide (ne rien faire), cascade , set null . Ce champ est facultatif, et s'il n'est pas spécifié, la valeur cascade sera utilisée.
      • $onUpdate 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 elle n'est pas spécifié, la valeur cascade sera utilisée.
      • $purge - un drapeau pour permettre le nettoyage des lignes après l'ajout d'une clé étrangère (p.ex. supprimer les enregistrements qui ne sont pas référencés)
    • addKey() la méthode est utilisée pour ajouter des index à un tableau. Il a de tels paramètres:
      • $tableName - le nom de la table où l'index doit être ajouté
      • $indexName - le nom de l'index
      • $fields - nom(s) de colonne Utilisé (s) dans l'index
      • $indexType - type de l'indice. Les valeurs possibles sont: index , unique , primary , fulltext . Ce paramètre est optionnel, donc la valeur par défaut est index
    • dropColumn() la méthode est utilisée pour supprimer les colonnes du tableau existant. Il a de tels paramètres:
      • $tableName - le nom de la table qui doit être modifié
      • $columnName - le nom de la colonne, qui devrait être supprimé
    • dropForeignKey() la méthode est utilisée pour enlever les clés étrangères. Il a de tels paramètres:
      • $tableName - le nom de la table pour enlever une clé étrangère
      • $fkName - le nom de la clé étrangère
    • La méthode dropKey() est utilisée pour enlever les index de table. Il a de tels paramètres:
      • $tableName - le nom de la table où l'index doit être supprimé
      • $keyName - le nom d'index
    • modifyColumn la méthode est utilisée pour modifier la colonne existante du tableau. Il a de tels paramètres:
      • $tableName - le nom de la table qui doit être modifié
      • $columnName - le nom de la colonne, qui doit être renommée
      • $definition - une nouvelle définition de la colonne ( INT(10) , DECIMAL(12,4) , etc)
    • changeColumn méthode utilisée pour modifier et renommer la colonne existante dans le tableau. Il a de tels paramètres:
      • $tableName - le nom de la table qui doit être modifié
      • $oldColumnName - l'ancien nom du colonne, qui doit être renommée et modifiée
      • $newColumnName - un nouveau nom de la colonne
      • $definition - une nouvelle définition de la colonne ( INT(10) , DECIMAL(12,4) , etc)
    • La méthode
    • changeTableEngine est utilisée pour changer le moteur de table, de MyISAM à InnoDB par exemple. Il a de tels paramètres:
      • $tableName - le nom de la table
      • $engine - nouveau nom de moteur( MEMORY , MyISAM , InnoDB , etc)

vous pouvez également utiliser la méthode tableColumnExists pour vérifier l'existence de la colonne.

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

, N'hésitez pas à regarder dans la définition de la classe dont vous allez utiliser, vous pouvez trouver beaucoup de choses intéressantes pour vous :)

126
répondu Ivan Chepurnyi 2017-02-26 16:34:03

l'idée que les mises à jour Magento ne devraient pas inclure SQL est basée 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 pour mettre à jour Magento, ce qui garantit que si L'équipe de Magento change la façon dont les objets interagissent avec le datastore, vos mises à jour fonctionneront toujours (en supposant que l'équipe de base maintient l'original "contrat" tacite par les méthodes de l'Objet)

donc, le problème est un ALTER TABLE statement change directement le datastore. Si vous vous abonnez exclusivement aux deux idées ci-dessus, vous ne devriez jamais changer la boutique de données. (ce qui, dans le cas d'ajouter une colonne ou un index signifie utiliser exclusivement des modèles EAV, utiliser les ressources de configuration pour gérer les changements, et accepter L'indexation de Magento).

A bonne règle générale de base est, si vous changez ou ajouter sur certaines fonctionnalités de base Magento (produits, critiques, etc.), évitez de modifier directement la structure de la base de données à moins que vous ne soyez prêt à la gérer soigneusement pendant les mises à niveau.

si vous construisez de nouveaux objets et de nouvelles fonctionnalités utilisez N'importe quel SQL que vous voulez créer et changer vos tables via des ressources de configuration. Si vous regardez les fichiers d'installation / mise à jour, vous pouvez voir que L'équipe de base de Magento fait ceci m'.

18
répondu Alan Storm 2010-11-30 20:08:02

pour modifier une table et ajouter une colonne avec une clé étrangère, J'ai utilisé avec succès ce 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
        );

ce sont les méthodes de Varien_Db_Adapter_Pdo_Mysql .

12
répondu Bouni 2014-02-13 04:37:54