Magento 2.3:如何在自定义模块中实现声明性架构


Answers:


39

首先,在其中创建db_schema.xml文件/RH/Helloworld/etc并编写以下代码:

<?xml version="1.0"?>
<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="rh_helloworld" resource="default" engine="innodb" comment="RH Helloworld">
        <column xsi:type="smallint" name="id" padding="6" unsigned="false" nullable="false" identity="true" comment="ID"/>
        <column xsi:type="varchar" name="author_name" nullable="false" length="25" comment="Name"/>
        <column xsi:type="varchar" name="email" nullable="false" length="25" comment="Email"/>
        <column xsi:type="varchar" name="description" nullable="false" length="255" comment="Descrition"/>
        <constraint xsi:type="primary" referenceId="PRIMARY">
            <column name="id"/>
        </constraint>
    </table>
</schema>
  • <table> .. </table> =“用于创建和设置表名称”
  • <column> .. </column> =“用于创建和设置表的列”
  • <constraint> .. </constraint> =“用于设置约束,例如主键,外键,唯一键等。

在运行upgrade命令之前,您需要db_whitelist_schema.json通过运行以下命令将架构添加到文件中:

php bin/magento setup:db-declaration:generate-whitelist --module-name=RH_Helloworld

现在,db_whitelist_schema.json将在/RH/Helloworld/etc文件夹中创建文件。

现在开始 php bin/magento s:up

表将在数据库内部创建。

=>如果要重命名列,则需要db_schema.xml在适当的列中的以下行中进行设置:

<column xsi:type="varchar" name="customer_email" onCreate="migrateDataFrom(email)" on_update="false" nullable="false" default="" comment="Customer Email"/>

在这里,名称=“新列名称”onCreate =“ migrateDataFrom()” =“旧列名称”

=>如果要删除表,则可以从xml文件中删除整个表节点,也可以将Disabled属性设置为true,如下面的代码所示db_schema.xml

<table name="rh_helloworld" resource="default" engine="innodb" comment="RH Helloworld" disabled="true">
 ..
 </table>

有关更多详细信息,您可以在此处检查

希望对您有帮助。


1
好人@Rohan
Ramkishan Suthar

很好的解释.....非常感谢....这真的很有帮助....
苛刻的khandhar

乐意效劳 !!快乐的编码:)&谢谢@RamkishanSuthar
Rohan Hapani

为什么我们需要生成db_whitelist_schema.json?
Ramanathan

@RohanHapani如何使用自定义扩展名在Magento 2.3.0中创建自定义产品属性?
Kishan Patadia

12

在任何自定义模块的etc文件夹下创建名为db_schema.xml的文件。

<?xml version="1.0" encoding="UTF-8"?>

<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="books_data" resource="default" engine="innodb" comment="Book Table">
        <column xsi:type="smallint" name="id" padding="6" unsigned="false" nullable="false" identity="true" comment="BOOK ID"/>
        <column xsi:type="varchar" name="book_name" nullable="false" length="255" comment="Book Name"/>
        <column xsi:type="int" name="author" unsigned="true" nullable="true" identity="false" default="" comment="Author"/>
        <column xsi:type="varchar" name="isbn_no" nullable="true" comment="ISBN No"/>
        <column xsi:type="timestamp" name="publish_date" on_update="false" nullable="false" default="CURRENT_TIMESTAMP"
                comment="Publish Date"/>
      <column xsi:type="varchar" name="language" nullable="true" comment="Language"/>
         <column xsi:type="decimal" name="mrp" scale="4" precision="12" unsigned="false" nullable="false"
                default="0" comment="MRP"/>
        <constraint xsi:type="primary" name="PRIMARY">
            <column name="id"/>
        </constraint>
    </table>

    <table name="author_data" resource="default" engine="innodb" comment="Author Table">
        <column xsi:type="smallint" name="id" padding="6" unsigned="false" nullable="false" identity="true" comment="Author ID"/>
        <column xsi:type="varchar" name="author_name" nullable="false" length="255" comment="Author Name"/>
        <column xsi:type="varchar" name="author_email" nullable="false" length="255" comment="Author Email"/>
        <column xsi:type="varchar" name="affliation" nullable="false" length="255" comment="Affliation"/>
        <column xsi:type="int" name="age" unsigned="true" nullable="true" identity="false" default="" comment="Age"/>
        <constraint xsi:type="primary" name="PRIMARY">
            <column name="id"/>
        </constraint>
    </table>
</schema>

现在在同一路径下创建db_whitelist_schema.json

php bin/magento setup:db-declaration:generate-whitelist --module-name=Vendor_Module

之后,只需运行php bin / magento setup:upgrade即可。有关更多信息,请单击此处。如果您需要更多说明,请告诉我。


但是...这是与上面相同的答案。为什么要双重发布?
Jisse Reitsma '19

我在上述答案之前发布了@JisseReitsma。检查两个答案的时间。
拉姆基山

我的错:你们两个人都在原始帖子发布后的14分钟内回答了这个问题,您的速度更快了一点。看来你们使尽快回答新问题成为一项运动:)
Jisse Reitsma,

1
答案是完美的。我想添加更多信息:旧方法(InstallSchema)的主要缺点是Magento盲目地应用更改。例如,在一个版本中,可能会引入新的数据库列,而在下一版本中将其删除。声明式设置消除了这种不必要的工作。
HaFiz Umer

0

Magento 2.3核心模块使用了声明式架构方法,而不是安装升级脚本。这是Magento 2.3及更高版本中推荐的新方法。Magento 2.3.x仍在使用InstallSchema,InstallData等。

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.