ALTER TABLE in Magento setup script without using SQL

Jonathan Day mówi

" aktualizacje nie powinny być w formie Polecenia SQL". Nie natknąłem się na wszelkie oświadczenia DDL lub DML, które nie mogą być wykonywane przez config Magento struktury.

(W pytaniu Jak mogę przenieść zmiany konfiguracji ze środowiska deweloperskiego do produkcyjnego?)

Chciałbym wiedzieć, jak najlepiej dodać/zmodyfikować / usunąć kolumnę lub indeks do / z tabeli w ten sposób, ale bez polegania na SQL? Czy to w ogóle możliwe?

Ponadto, jakie inne działania można wykonać tylko w SQL?

Author: Community, 2010-11-30

3 answers

Możesz użyć takich metod w swoim skrypcie konfiguracji:

  • Użyj klasy Varien_Db_Ddl_Table do tworzenia nowych tabel, gdzie możesz skonfigurować wszystkie pola, klucze, relacje w połączeniu z $this->getConnection()->createTable($tableObject) Przykład:

    /* @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);
    
  • Użyj metody setup connection ($this->getConnection()):

    • addColumn() metoda dodaje nową kolumnę do wyjściowej tabeli. Posiada takie parametry:
      • $tableName - Nazwa tabeli, która powinna zostać zmieniona
      • $columnName - Nazwa kolumny, która powinna be added
      • $definition - definicja kolumny (INT(10), DECIMAL(12,4), etc)
    • addConstraint() metoda tworzy nowe ograniczenie klucza obcego. Posiada takie parametry
      • $fkName - Nazwa klucza obcego, powinna być unikalna dla bazy danych, jeśli nie podasz prefiksu FK_, zostanie ona dodana automatycznie
      • $tableName - Nazwa tabeli do dodania klucza obcego
      • $columnName - Nazwa kolumny, która powinna odnosić się do innej tabeli, jeśli masz złożony klucz obcy, użyj przecinek do określenia więcej niż jednej kolumny
      • $refTableName - obca nazwa tabeli, która będzie obsługiwana
      • $refColumnName - Nazwa kolumny w obcej tabeli
      • $onDelete - działanie na usuwanie wierszy w tabeli obcej. Może być pusty łańcuch (nie rób nic), cascade, set null. To pole jest opcjonalne i jeśli nie jest określone, zostanie użyta wartość cascade.
      • $onUpdate operacja aktualizacji klucza wiersza w tabeli obcej. Może być pusty łańcuch (nie rób nic), cascade, set null. To pole jest opcjonalne, a jeśli nie jest określone, zostanie użyta wartość cascade.
      • $purge - znacznik umożliwiający czyszczenie wierszy po dodaniu klucza obcego (np. usunięcie rekordów, które nie są do nich odwołane)
    • addKey() metoda służy do dodawania indeksów do tabeli. Posiada takie parametry:
      • $tableName - Nazwa tabeli, do której należy dodać indeks
      • $indexName - nazwa indeksu
      • $fields - Nazwa (- y) kolumny używana (- E) w indeksie
      • $indexType - rodzaj indeksu. Możliwe wartości to: index, unique, primary, fulltext. Ten parametr jest opcjonalny, więc wartością domyślną jest index
    • dropColumn() metoda służy do usuwania kolumn z istniejącej tabeli. Posiada takie parametry:
      • $tableName - Nazwa tabeli, która powinna zostać zmieniona
      • $columnName - Nazwa kolumny, która powinna zostać usunięta
    • dropForeignKey() metoda służy do usuwania kluczy obcych. Posiada takie parametry:
      • $tableName - Nazwa tabeli do usuwania klucza obcego
      • $fkName - Nazwa klucza obcego
    • dropKey() metoda służy do usuwania indeksów tabeli. Posiada takie parametry:
      • $tableName - Nazwa tabeli, w której należy usunąć indeks
      • $keyName - nazwa indeksu
    • modifyColumn metoda służy do modyfikacji istniejącej kolumny w tabeli. Posiada takie parametry:
      • $tableName - Nazwa tabeli, która należy zmodyfikować
      • $columnName - Nazwa kolumny, która powinna zostać zmieniona
      • $definition - nowa definicja kolumny (INT(10), DECIMAL(12,4), etc)
    • changeColumn metoda służy do modyfikacji i zmiany nazwy istniejącej kolumny w tabeli. Posiada takie parametry:
      • $tableName - Nazwa tabeli, która powinna zostać zmieniona
      • $oldColumnName - stara nazwa kolumny, która powinna zostać zmieniona i zmieniona
      • $newColumnName - nowa nazwa kolumny
      • $definition - a nowa definicja kolumny (INT(10), DECIMAL(12,4), etc)
    • changeTableEngine metoda służy do zmiany silnika tabeli, na przykład z MyISAM na InnoDB. Posiada takie parametry:
      • $tableName - Nazwa tabeli
      • $engine - nowa nazwa silnika (MEMORY, MyISAM, InnoDB, etc)

Możesz również użyć metody tableColumnExists do sprawdzenia istnienia kolumny.

To nie jest pełna lista metod, które są dostępne dla ciebie, aby pozbyć się bezpośredniego Pisanie zapytań SQL. Więcej można znaleźć na zajęciach Varien_Db_Adapter_Pdo_Mysql i Zend_Db_Adapter_Abstract.

Nie wahaj się zajrzeć do definicji klasy, której będziesz używać, możesz znaleźć wiele ciekawych rzeczy dla siebie:)

 126
Author: Ivan Chepurnyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-26 16:34:03

Idea, że wszelkie aktualizacje Magento nie powinny zawierać SQL, opiera się na idei, że

  1. Obiekty Magento zapewniają abstrakcje na Twojej warstwie bazy danych / magazynu danych

  2. Powinieneś użyć abstrakcji, aby zaktualizować Magento, co zapewnia, że jeśli zespół Magento zmieni sposób interakcji obiektów z magazynem danych, Twoje aktualizacje będą nadal działać (zakładając, że główny zespół utrzymuje oryginalne "Kontrakty" implikowane przez metody obiektu)

Tak więc, problem polega na tym, że ALTER TABLE Instrukcja bezpośrednio zmienia magazyn danych. Jeśli subskrybujesz wyłącznie powyższe dwa pomysły, nigdy nie powinieneś zmieniać magazynu danych. (co w przypadku dodawania kolumny lub indeksu oznacza korzystanie wyłącznie z modeli EAV, korzystanie z zasobów konfiguracyjnych do zarządzania zmianami i akceptowanie indeksowania Magento).

Dobrą ogólną zasadą jest, jeśli zmieniasz lub dodajesz niektóre podstawowe funkcje Magento (produkty, recenzje itp.), trzymaj się z dala od bezpośrednio zmieniając strukturę bazy danych, chyba że chcesz starannie zarządzać nią podczas aktualizacji.

Jeśli budujesz nowe obiekty i funkcjonalność, użyj dowolnego języka SQL, który chcesz utworzyć i zmień tabele za pomocą zasobów konfiguracyjnych. Jeśli spojrzysz na pliki Instalatora/aktualizacji, zobaczysz, że główny zespół Magento robi to samodzielnie.

 18
Author: Alan Storm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-30 20:08:02

Aby zmienić tabelę i dodać kolumnę z kluczem obcym, korzystałem z tego z powodzeniem używając 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
        );

Są to metody z Varien_Db_Adapter_Pdo_Mysql.

 12
Author: Bouni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 04:37:54