Magento2 InstallSchema fügt der vorhandenen Tabelle eine neue Spalte hinzu

11

Ich versuche, eine neue Spalte zu einer vorhandenen Tabelle in magento2 hinzuzufügen

<?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

Nichts passiert

Update 1.

Wenn ich das Ziel klar verstehe, wird InstallSchema nur ausgeführt, wenn die Setup-Tabelle keine Werte enthält. Wenn Ihr Modul bereits im System installiert ist, müssen Sie Änderungen in UpgradeSchema vornehmen. Das liegt daran, dass meine Datei nicht ausgeführt wurde. Als ich es umbenannte, um ein Upgrade durchzuführen und die erforderlichen Änderungen vorzunehmen, funktionierte alles ordnungsgemäß

zhartaunik
quelle

Antworten:

7

Zunächst gehe ich davon aus, dass das Setup-Skript wie gewohnt ausgeführt wird, wenn Sie sagen, dass nichts passiert, aber keine Fehler ausgegeben werden und keine Änderungen an Ihrer Datenbank vorgenommen wurden. Wenn dies keine korrekte Annahme ist, lassen Sie es mich bitte wissen!

Wenn ich ein Upgrade des Schemas durchführe, mache ich kein getTable(), ich halte das für überflüssig.

Ich habe das obige Skript mit dieser Änderung getestet und es hat funktioniert. Die beiden Schritte zur Fehlerbehebung, die ich ausführen würde, lauten wie folgt:

  1. Stellen Sie sicher, dass Sie das setup_versionin Ihrem erhöht haben module.xml(oder Ihr Skript wird überhaupt nicht ausgeführt).
  2. Fügen Sie Ihrem Upgrade-Skript einen offensichtlichen Fehler hinzu, um festzustellen, ob es überhaupt ausgeführt wird. Wenn ein Fehler vorliegt und das Skript ausgeführt wird, werden beim Ausführen Fehlermeldungen angezeigt setup:upgrade

Ich hoffe das hilft!

Jer_
quelle
1
Danke für Ihre Antwort. Wenn ich das Ziel klar verstehe, wird InstallSchema nur ausgeführt, wenn die Setup-Tabelle keine Werte enthält. Wenn Ihr Modul bereits im System installiert ist, müssen Sie Änderungen in UpgradeSchema vornehmen. Das liegt daran, dass meine Datei nicht ausgeführt wurde. Als ich es umbenannte, um zu aktualisieren und notwendige Änderungen vorzunehmen - alles begann richtig zu funktionieren
zhartaunik
Es tut mir leid, das ist zu 100% richtig. Schritt 1 hätte darin bestehen müssen, den Eintrag aus der Tabelle setup_module zu löschen oder ihn zu einem Upgrade-Skript zu machen. Ich bin froh, dass es für dich funktioniert!
Jer_
0

Löschen Sie den Eintrag des Moduls aus der Tabelle 'setup_module' und führen Sie den Befehl php bin / magento setup: upgrade aus. Es wird klappen.

Prüfung
quelle
0

Sie können ein Skript und in Ihrem dbscripts-Ordner erstellen und diese Datei über das Terminal oder den Webbrowser ausführen.

Speichern Sie beispielsweise die Datei, pub/dbscripts/filename.phpfügen Sie diesen Code ein und ändern Sie ihn entsprechend Ihren Anforderungen

<?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";

Führen Sie diese Datei wie im Browser aus

domain.name/pub/dbscripts/filename.php
Asad Ullah
quelle