InstallSchema de Magento2 agrega una nueva columna a la tabla existente

11

Estoy tratando de agregar una nueva columna a la tabla existente en 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();
    }
}

Configuración de bin bin / magento: actualización

No pasa nada

Upd 1.

Si entiendo claramente el objetivo, InstallSchema se ejecuta solo cuando no hay valores en la tabla de configuración. Si su módulo ya está instalado en el sistema, debe realizar cambios en UpgradeSchema. Eso porque mi archivo no se ejecutó. Cuando le cambié el nombre para actualizar y hacer los cambios necesarios, todo comenzó a funcionar correctamente

zhartaunik
fuente

Respuestas:

7

Primero, supongo que cuando dice que no sucede nada, quiere decir que el script de configuración se ejecuta como de costumbre, pero no se generan errores y no se realizaron cambios en su base de datos. Si esto no es una suposición correcta, ¡hágamelo saber!

Cuando hago una actualización del esquema, no hago una getTable(), creo que es superfluo.

Probé el script anterior con ese cambio, y funcionó, por lo que los dos pasos de solución de problemas que tomaría son:

  1. Asegúrese de haber incrementado el setup_versionen su module.xml(o su script no se ejecutará en absoluto)
  2. Agregue algún error obvio en su script de actualización para ver si se está ejecutando en absoluto ... si hay un error y el script se está ejecutando, recibirá mensajes de error al ejecutar setup:upgrade

¡Espero que eso ayude!

Jer_
fuente
1
Gracias por su respuesta. Si entiendo claramente el objetivo, InstallSchema se ejecuta solo cuando no hay valores en la tabla de configuración. Si su módulo ya está instalado en el sistema, debe realizar cambios en UpgradeSchema. Eso porque mi archivo no se ejecutó. Cuando le
cambié el
Lo siento, eso es 100% correcto, el paso 1 debería haber sido eliminar la entrada de la tabla setup_module o convertirla en un script de actualización. ¡Me alegra que te esté funcionando!
Jer_
0

Elimine la entrada del módulo de la tabla 'setup_module' y luego ejecute el comando php bin / magento setup: upgrade. Funcionará.

prueba
fuente
0

puede crear un script y en su carpeta dbscripts y ejecutar este archivo desde la terminal o el navegador web.

por ejemplo, guarde el archivo y pub/dbscripts/filename.phppegue este código y cámbielo de acuerdo con sus requisitos

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

ejecuta este archivo desde el navegador como

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