无需重装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
相关产品推荐
相关产品推荐

