Magento2 InstallSchema aggiunge una nuova colonna alla tabella esistente


11

Sto cercando di aggiungere una nuova colonna alla tabella esistente in magento2

<?php

namespace Vendor\Module\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallSchema implements InstallSchemaInterface
{

    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;

        $installer->startSetup();

        $eavTable = $installer->getTable('eav_attribute');

        $columns = [
            'my_column' => [
                'type' => \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
                'length' => '1',
                'nullable' => false,
                'comment' => 'Description of my column',
            ],
        ];

        $connection = $installer->getConnection();
        foreach ($columns as $name => $definition) {
            $connection->addColumn($eavTable, $name, $definition);
        }

        $installer->endSetup();
    }
}

php bin / magento setup: upgrade

Non succede nulla

Aggiornamento 1.

Se capisco chiaramente l'obiettivo, InstallSchema viene eseguito solo quando non ci sono valori nella tabella di installazione. Se il modulo è già installato nel sistema, è necessario apportare modifiche in UpgradeSchema. Questo perché il mio file non è stato eseguito. Quando l'ho rinominato per aggiornarlo e apportare le modifiche necessarie, tutto ha iniziato a funzionare correttamente

Risposte:


7

Innanzitutto, suppongo che quando dici che non succede nulla, intendi che lo script di installazione viene eseguito normalmente, ma non vengono generati errori e non sono state apportate modifiche al database. Se questo non è un presupposto corretto, per favore fatemi sapere!

Quando eseguo un aggiornamento allo schema, non lo faccio getTable(), penso che sia superfluo.

Ho testato lo script sopra con quella modifica e ha funzionato, quindi i due passaggi per la risoluzione dei problemi che vorrei prendere sono:

  1. Assicurati di aver incrementato il setup_versionnel tuo module.xml(o il tuo script non verrà eseguito affatto)
  2. Aggiungi qualche errore evidente nel tuo script di aggiornamento per vedere se è in esecuzione ... se c'è un errore e lo script è in esecuzione, riceverai messaggi di errore durante l'esecuzione setup:upgrade

Spero che aiuti!


1
Grazie per la vostra risposta. Se capisco chiaramente l'obiettivo, InstallSchema viene eseguito solo quando non ci sono valori nella tabella di installazione. Se il modulo è già installato nel sistema, è necessario apportare modifiche in UpgradeSchema. Questo perché il mio file non è stato eseguito. Quando l'ho rinominato per aggiornarlo e apportare le modifiche necessarie - tutto ha iniziato a funzionare correttamente
zhartaunik,

Mi dispiace, è corretto al 100%, il passaggio 1 avrebbe dovuto essere quello di eliminare la voce dalla tabella setup_module o di renderla uno script di aggiornamento. Sono contento che funzioni per te!
Jer_18

0

Elimina la voce del modulo dalla tabella 'setup_module', quindi esegui il comando php bin / magento setup: upgrade. Funzionerà.


0

è possibile creare uno script e nella cartella dbscripts ed eseguire questo file dal terminale o dal browser web.

es. salva il file in pub/dbscripts/filename.phpincolla questo codice e cambia in base alle tue esigenze

<?php
use Magento\Framework\App\Bootstrap;
require '../../app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get('Magento\Framework\App\State');
$state->setAreaCode('frontend');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
error_reporting(E_ALL);
ini_set('display_errors', 1);
$resource = $objectManager->get('Magento\Framework\App\ResourceConnection');
$connection = $resource->getConnection();

$salesTable = $resource->getTableName('Table_Name');
$sql = "ALTER TABLE ".$salesTable. " ADD `Field_name` varchar(255)";
$connection->query($sql);

echo"Script Run Successfully";

eseguire questo file dal browser come

domain.name/pub/dbscripts/filename.php
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.