Magento2 InstallSchema adiciona nova coluna à tabela existente

11

Estou tentando adicionar nova coluna à tabela existente no 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: atualização

Nada acontece

Atualização 1.

Se eu entender claramente o objetivo, o InstallSchema será executado apenas quando não houver valores na tabela de instalação. Se o seu módulo já estiver instalado no sistema - você precisará fazer alterações no UpgradeSchema. Isso porque meu arquivo não foi executado. Quando o renomeei para atualizar e fazer as alterações necessárias - tudo começou a funcionar corretamente

zhartaunik
fonte

Respostas:

7

Primeiro, suponho que quando você diz que nada acontece, você quer dizer que o script de instalação é executado normalmente, mas nenhum erro é gerado e nenhuma alteração foi feita no banco de dados. Se essa não for uma suposição correta, entre em contato!

Quando faço uma atualização para o esquema, não faço a getTable(), acho que isso é supérfluo.

Testei o script acima com essa alteração e funcionou, portanto, as duas etapas de solução de problemas que devo seguir são:

  1. Verifique se você incrementou o valor setup_versionno seu module.xml(ou seu script não será executado)
  2. Adicione algum erro óbvio no seu script de atualização para ver se está em execução ... se houver um erro e o script estiver em execução, você receberá mensagens de erro ao executar setup:upgrade

Espero que ajude!

Jer_
fonte
1
Obrigado pela sua resposta. Se eu entender claramente o objetivo, o InstallSchema será executado apenas quando não houver valores na tabela de instalação. Se o seu módulo já estiver instalado no sistema - você precisará fazer alterações no UpgradeSchema. Isso porque meu arquivo não foi executado. Quando eu renomeou para atualizar e fazer as mudanças necessárias - tudo começou a funcionar correctamente
zhartaunik
Sinto muito, isso é 100% correto, a etapa 1 deveria ter sido excluir a entrada da tabela setup_module ou torná-la um script de atualização. Estou feliz que esteja trabalhando para você!
Jer_
0

Exclua a entrada do módulo da tabela 'setup_module' e execute o comando php bin / magento setup: upgrade. Vai funcionar.

teste
fonte
0

você pode criar um script e na pasta dbscripts e executar esse arquivo no terminal ou no navegador da web.

por exemplo, salve o arquivo, pub/dbscripts/filename.phpcole este código e altere de acordo com sua exigência

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

execute este arquivo no navegador como

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