wake-up-neo.com

ALTER TABLE im Magento-Setup-Skript ohne SQL

Jonathontag sagt

msgstr "Aktualisierungen DÜRFEN NICHT in Form von SQL - Befehlen erfolgen". Ich habe keine DDL- oder DML-Anweisungen gefunden, die nicht über Magentos Konfigurationsstrukturen ausgeführt werden können.

(In der Frage Wie kann ich Konfigurationsänderungen von der Entwicklungsumgebung in die Produktionsumgebung migrieren? )

Ich möchte wissen, wie eine Spalte oder ein Index auf diese Weise zu einer Tabelle hinzugefügt/geändert/daraus entfernt werden kann, ohne sich auf SQL zu verlassen. Ist es überhaupt möglich?

Welche anderen Aktionen können nur in SQL ausgeführt werden?

54
clockworkgeek

Sie können solche Methoden in Ihrem Setup-Skript verwenden:

  • Verwenden Sie die Klasse Varien_Db_Ddl_Table, Um neue Tabellen zu erstellen, in denen Sie alle Felder, Schlüssel und Beziehungen in Kombination mit $this->getConnection()->createTable($tableObject) konfigurieren können. Beispiel:

    /* @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);
    
  • Verwenden Sie die Methoden setup connection ($this->getConnection()):

    • addColumn() Methode fügt neue Spalte zum Verlassen der Tabelle hinzu. Es hat solche Parameter:
      • $tableName - Der Tabellenname, der geändert werden soll
      • $columnName - der Name der Spalte, die hinzugefügt werden soll
      • $definition - Definition der Spalte (INT(10), DECIMAL(12,4), etc)
    • Die Methode addConstraint() erstellt einen neuen Constraint-Fremdschlüssel. Es hat solche Parameter
      • $fkName - Der Fremdschlüsselname sollte pro Datenbank eindeutig sein. Wenn Sie das Präfix FK_ Nicht angeben, wird er automatisch hinzugefügt
      • $tableName - Der Tabellenname zum Hinzufügen eines Fremdschlüssels
      • $columnName - Der Spaltenname, auf den in einer anderen Tabelle verwiesen werden soll. Wenn Sie einen komplexen Fremdschlüssel haben, verwenden Sie ein Komma, um mehr als eine Spalte anzugeben
      • $refTableName - der fremde Tabellenname, der behandelt wird
      • $refColumnName - die Spaltennamen in der Fremdtabelle
      • $onDelete - Aktion zum Entfernen von Zeilen in der Fremdtabelle. Kann eine leere Zeichenkette sein (nichts tun), cascade, set null. Dieses Feld ist optional. Wenn es nicht angegeben ist, wird der Wert cascade verwendet.
      • $onUpdate - Aktion beim Aktualisieren des Zeilenschlüssels in der Fremdtabelle. Kann eine leere Zeichenkette sein (nichts tun), cascade, set null. Dieses Feld ist optional. Wenn es nicht angegeben ist, wird der Wert cascade verwendet.
      • $purge - Ein Flag zum Aktivieren der Bereinigung der Zeilen nach dem Hinzufügen von Fremdschlüsseln (z. B. Entfernen der Datensätze, auf die nicht verwiesen wird)
    • Die Methode addKey() wird zum Hinzufügen von Indizes zu einer Tabelle verwendet. Es hat solche Parameter:
      • $tableName - Der Tabellenname, in den der Index eingefügt werden soll
      • $indexName - der Indexname
      • $fields - Spaltenname (n), die im Index verwendet werden
      • $indexType - Typ des Index. Mögliche Werte sind: index, unique, primary, fulltext. Dieser Parameter ist optional. Der Standardwert ist index.
    • Die Methode dropColumn() wird zum Entfernen von Spalten aus der vorhandenen Tabelle verwendet. Es hat solche Parameter:
      • $tableName - Der Tabellenname, der geändert werden soll
      • $columnName - der Name der Spalte, die entfernt werden soll
    • Die Methode dropForeignKey() wird zum Entfernen von Fremdschlüsseln verwendet. Es hat solche Parameter:
      • $tableName - Der Tabellenname zum Entfernen eines Fremdschlüssels
      • $fkName - der Fremdschlüsselname
    • Die Methode dropKey() wird zum Entfernen der Tabellenindizes verwendet. Es hat solche Parameter:
      • $tableName - Der Tabellenname, in dem der Index entfernt werden soll
      • $keyName - der Indexname
    • Die Methode modifyColumn wird verwendet, um vorhandene Spalten in der Tabelle zu ändern. Es hat solche Parameter:
      • $tableName - Der Tabellenname, der geändert werden soll
      • $columnName - Der Name der Spalte, die umbenannt werden soll
      • $definition - eine neue Definition der Spalte (INT(10), DECIMAL(12,4), etc)
    • Die Methode changeColumn wird verwendet, um vorhandene Spalten in der Tabelle zu ändern und umzubenennen. Es hat solche Parameter:
      • $tableName - Der Tabellenname, der geändert werden soll
      • $oldColumnName - der alte Name der Spalte, die umbenannt und geändert werden soll
      • $newColumnName - ein neuer Name der Spalte
      • $definition - eine neue Definition der Spalte (INT(10), DECIMAL(12,4), etc)
    • Die Methode changeTableEngine wird verwendet, um die Tabellen-Engine zu ändern, beispielsweise von MyISAM nach InnoDB. Es hat solche Parameter:
      • $tableName - der Tabellenname
      • $engine - Name der neuen Engine (MEMORY, MyISAM, InnoDB usw.)

Sie können auch die Methode tableColumnExists verwenden, um die Existenz der Spalte zu überprüfen.

Es ist nicht die vollständige Liste der Methoden, die Ihnen zur Verfügung stehen, um das Schreiben direkter SQL-Abfragen loszuwerden. Weitere Informationen finden Sie in den Klassen Varien_Db_Adapter_Pdo_Mysql Und Zend_Db_Adapter_Abstract.

Zögern Sie nicht, in die Klassendefinition zu schauen, die Sie verwenden werden, Sie können viele interessante Dinge für sich selbst finden :)

128
Ivan Chepurnyi

Die Idee, dass Magento-Updates NICHT SQL enthalten SOLLTEN, basiert auf der Idee, dass

  1. Magento-Objekte bieten Abstraktionen auf Ihrer Datenbank-/Datenspeicherebene

  2. Sie sollten die Abstraktionen zum Aktualisieren von Magento verwenden. Dadurch wird sichergestellt, dass Ihre Aktualisierungen weiterhin funktionieren, wenn das Magento-Team die Interaktion der Objekte mit dem Datenspeicher ändert (vorausgesetzt, das Kernteam behält die ursprünglichen "Verträge" bei, die von den Object-Methoden impliziert werden).

Das Problem ist also ein ALTER TABLE Anweisung ändert sich direkt der Datenspeicher. Wenn Sie ausschließlich die beiden oben genannten Ideen abonnieren, sollten Sie den Datenspeicher niemals ändern. (Wenn Sie eine Spalte oder einen Index hinzufügen, müssen Sie ausschließlich EAV-Modelle verwenden, die Einrichtungsressourcen zum Verwalten von Änderungen verwenden und die Indizierung von Magento akzeptieren.).

Eine gute Faustregel ist, dass Sie beim Ändern oder Hinzufügen von Magento-Kernfunktionen (Produkte, Rezensionen usw.) die Datenbankstruktur nicht direkt ändern, es sei denn, Sie sind bereit, sie während eines Upgrades sorgfältig zu verwalten.

Wenn Sie neue Objekte und Funktionen erstellen, verwenden Sie die SQL-Anweisungen, die Sie zum Erstellen und Ändern Ihrer Tabellen über Setup-Ressourcen verwenden möchten. Wenn Sie sich die Installations-/Upgrade-Dateien ansehen, sehen Sie, dass das Magento-Kernteam dies selbst tut.

18
Alan Storm

Um eine Tabelle zu ändern und eine Spalte mit einem Fremdschlüssel hinzuzufügen, habe ich dies erfolgreich mit Magento CE v1.6.1.0 verwendet:

// 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
        );

Das sind Methoden von Varien_Db_Adapter_Pdo_Mysql.

12
Bouni