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”进行卸载,然后重新安装扩展程序。要检查它的另一个要点是github.com/magento/magento2/commit/等类似的UpgradeSchema.php。似乎此时此刻还没有干净的解释如何升级数据库,因此我也期待在这里纠正答案
FireBear

@FireBear appy下面的答案代码?
Suresh Chikani 2015年

还没有尝试,但是根据Catalog核心模块github.com/magento/magento2/blob/…的
FireBear 2015年

在大多数情况下,错误是由于没有为该类定义的命名空间引起的。检查是否为类定义了名称空间。
soukaina

Answers:


48

如果要将更多列添加到模块的现有表中,可以执行以下操作。

步骤1:在Setup文件夹下创建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_versionmodule.xml

步骤3:php bin/magento setup:upgrade从CLI 运行命令


1
您能举例说明我如何使用升级脚本添加主键吗?在我的表中有'customer_id',但它不是主键,现在我想将其添加为主键。
Suresh Chikani 2015年

是的,您可以使用ModifyColumnByDdl()函数对其进行更改。以下是架构。`公共函数ModifyColumn($ tableName,$ columnName,$ definition,$ flushData = false,$ schemaName = null);`
Praful Rajput

我如何将“ custome_id”字段用作主键?解释代码示例。
Suresh Chikani 2015年

您能否添加“我们如何修改现有列的类型?” 在你的问题吗?
Praful Rajput

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:在您的模块中,您将在该文件的etc文件夹内找到module.xml,更改setup_version值(例如:1.0.1至1.0.2)应高于当前版本值。

步骤3:从CLI运行php bin / magento setup:upgrade命令

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.