enanobots / m2-dbdumper
Magento 2 数据补丁创建器
Requires
- php: >=7.4
README
纳米机器人数据库导出器
本模块旨在简单创建 Magento 2 开源项目的先进数据库备份。它可以在 Adobe Cloud 和 Adobe Commerce 上工作,但您需要手动下载文件(这可能在模块的未来版本中更改)
好的,但是为什么?
很简单!因为我们能!但是说得更认真一点,Magento 2 在市场上已经存在很长时间了,没有人创建一个模块能够自带以下功能
- 允许对任何表指定 SQL 过滤器(例如限制产品目录,模块中包含 2 个示例)
- 默认对客户和用户管理员账户数据进行匿名化
- 垃圾数据永远不会添加到备份中
因此,这就是开发这个模块的原因。
安装
安装通过 composer
composer require enanobots/m2-dbdumper
安装包后,只需运行
php bin/magento setup:upgrade
要求
PHP 7.4及以上Magento 2.4.x及以上
测试于
Magento 2.4.xOpenSource
WIKI
本节将描述模块的设计。让我先从
导出模式
本模块允许您创建任何所需的数据库导出配置文件,但我称它们为 导出模型。主要导出模型实现了 ExportModelInterface,所有导出模型都定义为 虚拟类型,因此您可以添加任何所需的自定义导出模型。
在本扩展的第一个版本中,导出模型 有 4 个参数
$exportModeDescription- 如果您指定错误的导出模型,则在 CLI 中可见,仅作为视觉提示$applyFilters- 确定是否应应用表上的自定义过滤器$tableGroups- 如果您指定此列表,则可以从数据库中导出所选表$exportTypeForAllTables- 确定是否应导出自定义表的数据。是的...这个变量名可能需要更改
导出模型在 di.xml 中定义,此模块有 2 个额外的导出模型
custom- 过滤产品目录,稍后会详细介绍cms- 仅导出来自 CMS 表组的表
您可以在 di.xml 文件中找到这些
<virtualType name="customExportMode" type="Nanobots\DbDumper\Model\ExportModel"> <arguments> <argument name="exportModeDescription" xsi:type="string">Custom dump with filters</argument> <argument name="applyFilters" xsi:type="boolean">true</argument> <argument name="exportTypeForAllTables" xsi:type="number">0</argument> <!-- ask what to do --> </arguments> </virtualType> <virtualType name="cmsExport" type="Nanobots\DbDumper\Model\ExportModel"> <arguments> <argument name="exportModeDescription" xsi:type="string">Only CMS data</argument> <argument name="applyFilters" xsi:type="boolean">false</argument> <argument name="tableGroups" xsi:type="array"> <item name="cms" xsi:type="object">cms</item> </argument> </arguments> </virtualType>
这些导出模型需要添加到 DumpInterface 的 exportModels 参数中的 di.xml
<type name="Nanobots\DbDumper\Model\DumpInterface"> <arguments> <argument name="exportModels" xsi:type="array"> <item name="cms" xsi:type="object">cmsExport</item> <item name="custom" xsi:type="object">customExportMode</item> <item name="default" xsi:type="object">defaultExportMode</item> <item name="full" xsi:type="object">fullExportMode</item> </argument> [...] </arguments> </type>
您可以定义任意多的导出模型。
表组接口
本模块的主要部分基于一个假设,即 Magento 2 表可以划分为表组。一个表组是一个 虚拟类型,它使用一个实现 TableGroupInterface 的 TableGroup 模型。组的作用只是指定可以或应该对表组中的所有表执行的一组操作,这样我们就不需要为数据库中定义的每个表设置这些操作 - 虽然这是可能的,但这会使 di.xml 文件过于庞大而难以维护。
在本模块的初始版本中,组可以有 3 种组模式,由 di.xml 中的 groupExportMode 定义
default- 这意味着组中的每个表都会导出其所有数据reduntant- 此组中的表数据不会导出到数据库备份文件中anonymize- 这些表的数据需要被匿名化。默认情况下,它相关于:管理员账户、客户客户地址和销售数据。
手动运行导出时,表组导出模式会被CLI参数设置覆盖。
通过%字符对表进行分组
无需定义所有数据库表,您可以使用%字符指定通配符,并按如下方式使用
<item name="%_idx" xsi:type="null"/> <item name="%_log" xsi:type="null"/> <item name="%_cl" xsi:type="null"/> <item name="%_tmp" xsi:type="null"/> <item name="%_replica" xsi:type="null"/> <!-- [...] --> <item name="sequence_creditmemo_%" xsi:type="null"/>
代码将通过在数据库上运行适当的查询来找到所有匹配的表。
表导出界面
这是将数据库中的数据转换为主界面的主要界面
- 创建表/视图语句
- 从表中获取数据
并将其放入数据库转储文件
di.xml中定义了一个默认的restrictedColumns列表。如果需要匿名化(由表所属的表组定义)的表,将检查任何列是否与受限列列表匹配。如果在受限列列表中找到列,该表行的值将被“伪造”或匿名化。
示例:电子邮件匿名化
电子邮件数据伪造器(或匿名化器)有2个额外的参数
<type name="Nanobots\DbDumper\Model\DataFakers\Email"> <arguments> <argument name="emailSchema" xsi:type="string"><![CDATA[{{firstname}}.{{lastname}}]]></argument> <argument name="emailDomain" xsi:type="string"><![CDATA[nanobots.info]]></argument> </arguments> </type>
和2个方法
public function decorateData(int $entityId, ?string $value = null): string { return sprintf("%s@%s", $this->_getEmailFromSchema($entityId), $this->emailDomain); } private function _getEmailFromSchema(int $entityId): string { return str_replace( [ '{{firstname}}', '{{lastname}}' ], [ $this->translitUrl->filter($this->firstname->decorateData($entityId)), $this->translitUrl->filter($this->lastname->decorateData($entityId)) ], $this->emailSchema ); }
如果你检查Firstname数据伪造器类,你会看到它正在使用modulo除法。
[...]
return $this->firstNames[$entityId % (count($this->firstNames) - 1)];
[...]
这是故意的,所以每次你下载数据库时,你都会得到匹配但随机的名称或电子邮件,对于相同的ID。当你与团队一起调试销售/客户数据时,仅通过ID识别数据是很重要的。
在CLI中工作
要开始数据库转储操作,你可以在CLI中简单地运行以下命令
php bin/magento nanobots:dump --mode=ZZZ
这将启动dump命令。例如,让我们使用一个未定义的导出模式
php bin/magento nanobots:dump --mode=jakub
你将得到以下结果
在custom导出模型中,系统会询问如何处理未定义在表组中的表
通过输入0、1或2,您可以
- 强制数据库转储导出所有没有表组的表中的数据
- 跳过其他表的数据
- 退出
推荐操作
建议为每个你管理的项目创建自己的模块,并将表添加到指定的组中
core在di.xml中定义为虚拟组以导出所有数据empty在di.xml中定义为虚拟组以仅导出表结构
示例
您的自定义模块中的di.xml
<virtualType name="core" type="Nanobots\DbDumper\Model\TableGroup"> <arguments> <argument name="tableList" xsi:type="array"> <item name="my_custom_table_with_required_data" xsi:type="null" /> </argument> </arguments> </virtualType> <virtualType name="empty" type="Nanobots\DbDumper\Model\TableGroup"> <arguments> <argument name="tableList" xsi:type="array"> <item name="my_custom_table_with_redundant_data" xsi:type="null" /> </argument> </arguments> </virtualType>
重要!
- 最终数据库转储将索引器设置为
保存时模式。 xsi:type="null被大量用作数组键,因为我们最终的tables是数组- 所有
_cl表都是空的,并且它们的自增字段设置为1。 - 所有
mviews都设置为空闲状态 - SQL触发器在SQL转储中不会被删除,您可以通过将索引器设置为
计划模式来重新创建它们
数据类型
主要模块假设我们有3组数据
- 我们希望匿名化或以某种方式过滤的数据。
- 冗余且在数据库转储中不需要的数据。
- 未定义数据,这是我们不希望过滤或冗余的数据库中的所有数据。
基于这些假设,创建了多个接口
- GroupInterface - 用于创建带有表组的虚拟类型
- TableExportInterface
- BlaBlaInterface
发行说明 & 变更日志
1.0.0
- 模块发行,可能包含一些错误 :-)
模块的计划和下一个版本
- 1.1.0:在创建
DBDump之后将产品媒体图像添加到压缩文件中 - 1.2.0:添加管理员界面以控制和下载数据库转储(它们将受到保护)
- 1.3.0:扩展管理员界面和模块以包括数据库转储配置文件(有关详细信息请参考发布内容)
- 1.4.0:扩展模块以包括任务功能,以便能够进一步自定义和挂钩到数据库转储过程
