You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需重装Shopware插件,如何向其数据库添加数据表?

嘿,这个问题问到点子上了——谁也不想为了加个数据表就重装插件或者冒数据丢失的风险对吧?下面给你说清楚Shopware官方推荐的安全方案:

无需重装插件添加数据表的正确姿势

Shopware自带一套增量数据库迁移系统,这是官方认可的插件数据变更方案,完全不需要重装插件,也不会丢失现有数据。具体步骤如下:

1. 创建迁移文件

在你的插件目录下,找到src/Migration文件夹(如果没有就新建一个),创建一个遵循命名规则的迁移类文件:

  • 命名格式:Migration[时间戳][描述].php,比如Migration1699999999AddCustomerFavoriteTable.php
  • 时间戳用当前的Unix时间戳(确保比插件中已有的迁移文件时间戳大,这样Shopware会优先执行它)

迁移文件的示例代码如下:

<?php

namespace YourPluginNamespace\Migration; // 替换成你的插件命名空间

use Doctrine\DBAL\Connection;
use Shopware\Core\Framework\Migration\MigrationStep;

class Migration1699999999AddCustomerFavoriteTable extends MigrationStep
{
    // 返回你设置的时间戳,和文件名里的一致
    public function getCreationTimestamp(): int
    {
        return 1699999999;
    }

    // 这里放非破坏性的数据库变更(比如建表、加字段)
    public function update(Connection $connection): void
    {
        // 用CREATE TABLE IF NOT EXISTS确保不会重复建表,避免报错
        $createTableSql = <<<SQL
CREATE TABLE IF NOT EXISTS `customer_favorite` (
    `id` BINARY(16) NOT NULL PRIMARY KEY,
    `customer_id` BINARY(16) NOT NULL,
    `product_id` BINARY(16) NOT NULL,
    `created_at` DATETIME(3) NOT NULL,
    `updated_at` DATETIME(3) NULL,
    FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`) ON DELETE CASCADE,
    FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE,
    UNIQUE KEY `uniq_customer_product` (`customer_id`, `product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SQL;
        $connection->executeStatement($createTableSql);
    }

    // 这里放破坏性操作(比如删表、删字段),本次不需要就留空
    public function updateDestructive(Connection $connection): void
    {
        // 空实现即可
    }
}

2. 执行迁移脚本

有两种方式让Shopware执行这个新的迁移:

  • CLI命令(推荐,适合开发/生产环境):
    运行bin/console database:migrate --all执行所有待处理的迁移,或者指定你的插件:bin/console database:migrate YourPluginTechnicalName(替换成你的插件技术名称)
  • 后台操作:
    登录Shopware后台,进入「插件管理」找到你的插件,点击「刷新」按钮,Shopware会自动检测并执行新的迁移脚本
避免数据丢失的关键注意事项
  • 永远用迁移脚本做变更:不要手动直接修改数据库,迁移脚本会被Shopware跟踪,确保所有环境(开发/测试/生产)的数据库状态一致
  • 增量变更:如果后续需要修改这个新表(比如加字段),不要修改已有的迁移文件,而是创建一个新的迁移文件(用更大的时间戳)来执行ALTER TABLE操作
  • 谨慎编写SQL:使用IF NOT EXISTS(建表)、IF NOT EXISTS(加字段)这类语法,避免重复操作导致报错
  • 先测试再上线:在测试环境先执行迁移,验证数据无异常后,再部署到生产环境
  • 备份数据库:执行迁移前,最好先备份生产环境的数据库,以防万一

这种方式完全不需要重装插件,所有变更都是增量执行的,既不会影响现有插件功能,也不会丢失任何数据,是Shopware插件开发的最佳实践。

内容的提问来源于stack exchange,提问作者Nem Par

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:18:57