LoginSignup
1
1

More than 3 years have passed since last update.

Declarative Schema in Magento 2.3

Posted at

Declarative Schema in Magento 2.3

Magento has introduced a new feature called Declarative Schema which aims to simplify the Magento installation and upgrade processes. This new concept will allow a developer to get away from writing updates for each new version in favour of declaring the final result that the developer wants to achieve.

How to use Declarative Schema in Magento 2.3

we will only discuss file required for a Declarative Schema.

Firstly create a file db_schema.xml inside the folder Karabiner/Declarative/etc and write the following code

db_schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
  <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> 

Each table node represents a table in the database.

A table node can contain three types of subnodes:

  • Column
  • Constraint
  • Index

So when you run setup:upgrade command then it will create the table “author_data”

Adding New Column

If you want to add a new column to the existing table then you need to add a new column node in db_schema.xml and on running upgrade command it will add the new column.

db_schema.xml
<column xsi:type="int" name="new_column" unsigned="true" nullable="true" identity="false" default="" comment="New column"  />

Remove Existing Column

Now if you want to remove the existing column then you either need to remove the column node (< column >) inside the table node or you can set the disabled attribute to true.

db_schema.xml
<column xsi:type="int" name="age" unsigned="true" nullable="true" identity="false" default="" comment="Age" disabled=”true” />

But before running the upgrade command you need to add your schema to db_whitelist_schema.json file by running the following command-

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

Karabiner_Declarative is a module name. You need to specify your module name there.

Now on running setup:upgrade command, it will remove the column.

Changing the column type
You can change the column type, changing its type attribute to int, varchar, text etc.

Renaming a column

To rename a column you need to first remove the one you don’t want and add another column with your desired name. Now you need to migrate that column data into a newly created one, to do this you need to set an attribute on Create which will migrate data from the old column.
If we want to rename the author_email column to just email, we will remove the author column and add a new one.

db_schema.xml
<column xsi:type="varchar" name="email" onCreate="migrateDataFrom(author_email)" on_update="false" nullable="false" default="" comment="Author Email"/>
<column xsi:type="int" name="email" unsigned="true" nullable="true" identity="false" default="" comment="Email" disabled=”true” />

So this will create a new column ‘email’ with data from the removed column.

Drop a Table

To drop a table, either remove the entire table node from db_schema.xml or set the disabled attribute to true.

db_schema.xml
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"    xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
  <table name="author_data" resource="default" engine="innodb" comment="Author Table" disabled=”true”>
   ....
  </table>
</schema> 
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1