Magento2: как обновить схему базы данных


29

Я работаю над пользовательским модулем magento, в модуле которого есть Setup\InstallSchema.phpфайл, который установлен раньше. Я добавил еще несколько полей базы данных, InstallSchema.phpпоэтому я хочу обновить структуру таблицы, но таблица не применила никаких изменений.

Как я могу применить изменения схемы к таблице базы данных?

У меня есть команды процесса Cli для обновления схемы, но не удалось.

php bin/magento setup:db-schema:upgrade

а также

php bin/magento setup:upgrade

Вы можете удалить с помощью "php bin / magento module: uninstall" и установить ваше расширение снова. Еще один момент, чтобы проверить, что это UpgradeSchema.php, например, github.com/magento/magento2/commit/… Похоже, на данный момент здесь нет четкого объяснения, как обновить базу данных, поэтому я также с нетерпением жду правильного ответа здесь
FireBear

@FireBear Применить ниже код ответа?
Суреш Чикани

еще не пробовал, но выглядит правильно в соответствии с образцом из основного модуля каталога github.com/magento/magento2/blob/…
FireBear

В большинстве случаев ошибка возникает из-за отсутствия определенного пространства имен для класса. Убедитесь, что вы определили пространство имен для вашего класса.
Soukaina

Ответы:


48

Если вы хотите добавить больше столбцов в существующую таблицу вашего модуля, вы можете сделать следующее.

Шаг 1: Создайте UpgradeSchema.php в папке установки. Получить идею из следующего кода.

namespace Vendor\ModuleName\Setup;

use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
class UpgradeSchema implements  UpgradeSchemaInterface
{
    public function upgrade(SchemaSetupInterface $setup,
                            ModuleContextInterface $context){
        $setup->startSetup();
        if (version_compare($context->getVersion(), '1.0.1') < 0) {

            // Get module table
            $tableName = $setup->getTable('table_name');

            // Check if the table already exists
            if ($setup->getConnection()->isTableExists($tableName) == true) {
                // Declare data
                $columns = [
                    'imagename' => [
                        'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
                        'nullable' => false,
                        'comment' => 'image name',
                    ],
                ];

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

            }
        }

        $setup->endSetup();
    }
}

Шаг 2: Измените setup_versionзначение вmodule.xml

Шаг 3: Запустите php bin/magento setup:upgradeкоманду из CLI


1
Можете ли вы объяснить, как я могу добавить первичный ключ, используя скрипт обновления? в моей таблице есть 'customer_id', но это не первичный ключ, теперь я хочу добавить его в качестве первичного ключа.
Суреш Чикани

Да, вы можете изменить его с помощью функции modifyColumnByDdl (). Ниже приведена схема. `public function modifyColumn ($ tableName, $ columnName, $ definition, $ flushData = false, $ schemaName = null);`
Praful Раджпут

Как я могу применить поле custome_id в качестве первичного ключа? Объясните кодекс.
Суреш Чикани

Можете ли вы добавить "Как мы можем изменить тип существующего столбца?" в вашем вопросе?
Praful Раджпут

3
@Keyur Shah, вам не нужно создавать новый файл M2. Вы должны поместить следующий код в UpgradeSchema.php и обновить setup_version в module.xml. if (version_compare ($ context-> getVersion (), '1.0.0') <0) {// ваш код} if (version_compare ($ context-> getVersion (), '1.0.1') <0) {/ / ваш код}
Praful Rajput

2

Чтобы обновить схему установщика, вы должны написать «UpgradeSchema.php»,

пример UpgradeSchema.php:

namespace <namespace>\<modulename>\Setup;

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

/**
* @codeCoverageIgnore
*/
class UpgradeSchema implements UpgradeSchemaInterface
{
    /**
 * {@inheritdoc}
 */
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
    $installer = $setup;

    $installer->startSetup();

    /*your code here*/

    $installer->endSetup();
}
}

Шаг 2: В вашем модуле вы найдете файл module.xml внутри папки etc в этом файле. Значение параметра setup_version (например: 1.0.1 - 1.0.2) должно быть больше значения текущей версии.

Шаг 3: Запустите php bin / magento setup: команду обновления из CLI

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.