enanobots/m2-dbdumper

Magento 2 数据补丁创建器

1.0.6 2023-05-04 18:21 UTC

This package is auto-updated.

Last update: 2024-09-23 08:52:06 UTC


README

Open Source Love

纳米机器人数据库导出器

本模块旨在简单创建 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.x OpenSource

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>

这些导出模型需要添加到 DumpInterfaceexportModels 参数中的 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 表可以划分为表组。一个表组是一个 虚拟类型,它使用一个实现 TableGroupInterfaceTableGroup 模型。组的作用只是指定可以或应该对表组中的所有表执行的一组操作,这样我们就不需要为数据库中定义的每个表设置这些操作 - 虽然这是可能的,但这会使 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

你将得到以下结果

img_1.png

custom导出模型中,系统会询问如何处理未定义在表组中的表

通过输入012,您可以

  • 强制数据库转储导出所有没有表组的表中的数据
  • 跳过其他表的数据
  • 退出

推荐操作

建议为每个你管理的项目创建自己的模块,并将表添加到指定的组中

  • coredi.xml中定义为虚拟组以导出所有数据
  • emptydi.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:扩展模块以包括任务功能,以便能够进一步自定义和挂钩到数据库转储过程